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

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

패턴.txt:

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

문자열.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을 사용하고 있지만 다른 도구도 사용할 수 있습니다. 찾을 수 없는 다른 질문과 중복된 경우 죄송합니다.

답변1

일치하는 부분만 인쇄하고 그 결과를 grep -o원본 파일의 패턴으로 사용할 수 있습니다.grep -vpatterns.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)

답변2

가장 좋은 접근 방식은 아마도 @don_crissti가 제안한 것일 것입니다. 따라서 동일한 주제에 대한 변형은 다음과 같습니다.

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

이것은 기본적으로 @don_crissti의 접근 방식과 반대입니다. Perl 호환 정규 표현식( grep -P) 인 grep -o과 일치하는 행 부분만 인쇄하는 스위치를 사용합니다. 그런 다음 정규식은 해당 문자를 찾아서 name=삭제한 다음( ) 첫 번째 문자 ( ) \K까지 하나 이상의 문자를 찾습니다 . 이는 파일에 존재하는 패턴 목록을 생성한 다음 역 grep( ) 에 대한 입력으로 전달됩니다.".+?"String.txtgrep -v프로세스 교체( <(command)).

답변3

나는 그것을 사용할 수도 있습니다 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.txt출력은 pat다음과 같습니다.

"ExitWarning"
"SomeMessage"
"Help"

cut표준 출력과 일치하는 각 구분 기호에 대해 입력 행의 두 번째 "큰따옴표로 한정된 필드만 인쇄하고 -d다른 모든 필드는 표시하지 않습니다.-f-s

cut실제로 인쇄되는 내용은 grep다음과 같습니다.

Introduction
BananaOpinion
MessageToUser

grep-vstdin 패턴 파일의 고정 문자열과 일치하지 않는 행 에 대해 명명된 파일 피연산자를 검색합니다 .-F--f

두 번째로 "구분된 필드를 일치 필드로 사용하여 고정 문자열과 그 일부만 일치시킬 수 있다면 확실히 grep -Perl 패턴이 최적화 될 것입니다. 왜냐하면 무거운 작업이 수행되기 때문입니다.-Fcut빠르게.

답변4

또 다른 방법은 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고유한 줄만 인쇄됩니다.

관련 정보