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을 사용하고 있지만 다른 도구를 사용할 수 있습니다. 이것이 찾을 수없는 다른 질문과 중복 된 경우 사과드립니다.
답변
당신은 사용할 수 있습니다 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)
답변
가장 좋은 방법은 아마도 @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)
답변
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
elimited -f
의 ield 입력의 각 구분 일치 라인과 -s
다른 모든 uppresses.
무엇 cut
에 실제로 인쇄 grep
입니다 :
Introduction
BananaOpinion
MessageToUser
grep
stdin 패턴 파일 -v
의 -F
ixed 문자열 과 일치하지 않는 행에 대해 명명 된 파일 피연산자를 검색합니다 .-
-f
두 번째에 의존하는 경우 "
일치하는 방법과 -delimited 필드, 그것은 확실히 통해 최적화 될 것입니다 grep
-P
단지 일치하여 ERL 모드 -F
때문에 ixed 문자열과 그 중 작은 부분을 cut
무거운 리프팅을 수행 – 그리고 그것을 수행 빠르게 .
답변
for p in $(cat patterns.txt); do if ! grep $p strings.xml &>/dev/null; then echo $p; fi; done
이해하기 쉽지만 patterns.txt의 각 줄마다 하나씩 여러 grep 프로세스를 생성하는 다운 타임이 있습니다.
답변
또 다른 방법은 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
고유 한 줄만 인쇄합니다.