2개의 파일이 있습니다: args
및 text
.
args: [스크립트의 매개변수를 포함합니다]
life
happy
horse
텍스트:
The horse has a happy life.
Life is fun.
Kids are happy.
text
.NET의 모든 패턴이 포함된 줄을 인쇄하려면 명령이 필요합니다 args
. 이 경우:The horse has a happy life.
답변1
git grep
사용된 구문은 다음과 같습니다.git grep
여러 패턴을 결합하려면 부울 표현식을 사용하세요.
git grep -e "life" --and -e "happy" --and -e "horse"
위 명령은 모든 패턴과 일치하는 행을 한 번에 인쇄합니다.
파일이 버전 제어 대상이 아닌 경우 --no-index
매개변수를 추가합니다.
Git에서 관리하지 않는 파일을 현재 디렉터리에서 검색합니다.
도움을 확인하세요 man git-grep
.
grep
일반적으로 인수를 grep
사용하면 -f
최소한 하나의 패턴이 있는 줄이 인쇄됩니다.
grep -f args.txt file.txt
귀하의 경우에는 작동하지 않습니다.
따라서 모든 패턴과 일치하는 라인을 동시에 인쇄하려면 다음을 시도할 수 있습니다.
while read n text; do [ $n -eq $(wc -l < args.txt) ] && echo $text; done < <(while read patt; do grep "$patt" text.txt; done < args.txt | sort | uniq -c)
설명하다:
- 내부 루프는 사용 파일의 패턴 목록
while
에서 하나 이상의 패턴과 일치하는 모든 행을 인쇄합니다.text.txt
args.txt
- 그런 다음 목록이 정렬되고(
sort
) 발생 횟수가 계산됩니다(uniq -c
). - 외부
while
루프는 패턴 수와 동일한 발생 횟수args.txt
(예: 3)가 있는 행만 인쇄합니다.
또 다른 접근 방식은 하나 이상의 패턴과 일치하지 않는 모든 행을 삭제하는 것입니다.
Ex/Vim 편집기를 사용하여 파일을 제자리에서 변경하는 솔루션은 다음과 같습니다.
while read patt; do ex +"v/$patt/d" -scwq text.txt; done < args.txt
참고: 이렇게 하면 파일 자체에서 원하지 않는 줄이 제거됩니다.
다음은 화면에 결과를 인쇄하는 더 짧은 버전입니다.
ex $(xargs -I% printf "+v/%/d " < args.txt) +%p -scq! text.txt
해당 위치에 파일로 저장 +%p -scq!
하도록 변경합니다 .-scwq
이는 쉘 별칭을 정의하여 해결하는 방법입니다.
alias grep-all="</dev/stdin $(xargs printf '|grep "%s"' < args.txt)"
사용 예:
grep-all file.txt
관련된:
답변2
사용 awk
.
~$ cat textlist.txt | awk '/life/ && /happy/ && /horse/ { print; }'
The horse has a happy life
textlist.txt는 당신이 준 문장의 목록입니다.
답변3
agrep
다음을 사용하여 신청할 수 있습니다 .그리고작업. 아쉽게도 적용이 안되네요그리고파일의 패턴 목록이므로 먼저 명령 매개변수로 확장해야 합니다.
patterns=$(sed 's/;/\\;/' <args | tr '\n' ';' | sed 's/;$//')
agrep "$patterns" text
생성된 패턴 목록에 대한 수정 사항은 세미콜론으로 결합됩니다. 그러나 목록 끝에 세미콜론을 포함할 수 없으므로 제거됩니다. 이미 세미콜론이 포함된 패턴은 해당 문자를 이스케이프 처리하여 다음과 같이 처리되지 않도록 해야 합니다.그리고운영자. 파일이 어떻게 변환되었는지 echo "$patterns"
확인 하는 데 사용됩니다 .args
답변4
아마도 이것은 가장 효율적인 접근 방식은 아니지만 작동하는 것 같습니다.
# for a in $(cat args); do regex="$regex | grep '$a'"; done
# eval cat text "$regex"
The horse has a happy life.