파일의 패턴과 함께 grep을 사용하여 일치하지 않는 패턴 인쇄


15

patterns.txt :

"BananaOpinion"
"ExitWarning"
"SomeMessage"
"Help"
"Introduction"
"MessageToUser"

Strings.xml

<string name="Introduction">One day there was an apple that went to the market.</string>
<string name="BananaOpinion">Bananas are great!</string>
<string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>

예상 출력 :

"ExitWarning"
"SomeMessage"
"Help" 

에서 patterns.txt찾을 수없는 용어를 어떻게 인쇄 Strings.xml합니까? 에서 일치 / 일치 하지 않는 Strings.xml인쇄 할 수 있지만 일치 하지 않는 패턴은 어떻게 인쇄 합니까? ggrep (GNU grep) 버전 2.21을 사용하고 있지만 다른 도구를 사용할 수 있습니다. 이것이 찾을 수없는 다른 질문과 중복 된 경우 사과드립니다.

답변:


25

당신은 사용할 수 있습니다 grep -o만 일치하는 부분을 인쇄하고 두 번째에 대한 패턴과 같은 결과를 사용하여 grep -v원래의 patterns.txt파일을 :

grep -oFf patterns.txt Strings.xml | grep -vFf - patterns.txt

이 특별한 경우에도 join+ 를 사용할 수 있습니다 sort.

join -t\" -v1 -j2 -o 1.1 1.2 1.3 <(sort -t\" -k2 patterns.txt) <(sort -t\" -k2 strings.xml)

이것은 매우 우아하다.. 똑똑하다!
XXL

입력 파일이 여러 개인 경우 (예 : Strings1.xmlStrings2.xml) -h첫 번째 grep에 플래그 가 필요합니다 .
jayhendren

@ jayhendren-예, 그러나 모든 grep옵션이 해당 옵션을 지원 하지는 않습니다 . 입력 파일이 여러 개인 경우 단순히 왜 cat모든 파일을 얻을 수 없었 으며 결과를에 파이프 하는지 알 수 없습니다 grep.
don_crissti

5

가장 좋은 방법은 아마도 @don_crissti가 제안한 것이므로 동일한 주제에 대한 변형이 있습니다.

$ grep -vf <(grep -Po 'name=\K.+?"' Strings.xml) patterns.txt
"ExitWarning"
"SomeMessage"
"Help"

이것은 기본적으로 @don_crissti의 접근법과 반대입니다. 펄 호환 정규 표현식 ( -P)과 함께 grep을 사용 -o하고 라인의 일치하는 부분 만 인쇄하기 위해 스위치를 사용합니다. 그런 다음 정규 표현식을 찾아 name=버리고 ( \K), 첫 번째 "( .+?") 까지 하나 이상의 문자를 찾습니다 . 결과적으로 String.txt파일 에 패턴 목록이 표시되고 프로세스 대체 ( )를 grep -v사용하여 리버스 그렙 ( )에 입력으로 전달됩니다 .<(command)


2

cut아마 사용할 것입니다. 즉, 표시된대로 따옴표로 묶은 문자열을 어디에서 기대 해야하는지 알 수 있습니다.

만약 내가한다면:

{   cut  -sd\" -f2 |
    grep -vFf- pat
}   <<\IN
#   <string name="Introduction">One day there was an apple that went to the market.</string>
#   <string name="BananaOpinion">Bananas are great!</string>
#   <string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>
IN

... 당신의 예를 들어 내 자신의 복사본을 저장 한 후 patterns.txtpat출력이 위의 명령을 실행 :

"ExitWarning"
"SomeMessage"
"Help"

cut표준 출력으로 인쇄에만 두 번째 "따옴표 -delimited -f의 ield 입력의 각 구분 일치 라인과 -s다른 모든 uppresses.

무엇 cut에 실제로 인쇄 grep입니다 :

Introduction
BananaOpinion
MessageToUser

grepstdin 패턴 파일 -v-Fixed 문자열 과 일치하지 않는 행에 대해 명명 된 파일 피연산자를 검색합니다 .--f

두 번째에 의존하는 경우 "일치하는 방법과 -delimited 필드, 그것은 확실히 통해 최적화 될 것입니다 grep -P단지 일치하여 ERL 모드 -F때문에 ixed 문자열과 그 중 작은 부분을 cut무거운 리프팅을 수행 - 그리고 그것을 수행 빠르게 .


1
for p in $(cat patterns.txt); do if ! grep $p strings.xml &>/dev/null; then echo $p; fi; done

이해하기 쉽지만 patterns.txt의 각 줄마다 하나씩 여러 grep 프로세스를 생성하는 다운 타임이 있습니다.


0

또 다른 방법은 patterns.txt 및 Strings.xml을 하나의 목록에 넣고 고유 행을 찾는 것입니다

cat patterns.txt Strings.xml | grep -oFf patterns.txt | sort | uniq -u

설명:

cat patterns.txt Strings.xml모든 것을 하나의 목록에 넣습니다. grep -oFf patterns.txt각 줄에서 쓰레기를 제거합니다. sort자기 설명. 모든 줄을 정렬하십시오. uniq -u고유 한 줄만 인쇄합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.