패턴.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 -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)
답변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.txt
grep -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
-v
stdin 패턴 파일의 고정 문자열과 일치하지 않는 행 에 대해 명명된 파일 피연산자를 검색합니다 .-F
-
-f
두 번째로 "
구분된 필드를 일치 필드로 사용하여 고정 문자열과 그 일부만 일치시킬 수 있다면 확실히 grep
-P
erl 패턴이 최적화 될 것입니다. 왜냐하면 무거운 작업이 수행되기 때문입니다.-F
cut
빠르게.
답변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
고유한 줄만 인쇄됩니다.