파일의 모든 패턴을 한 번에 일치 [복제]

파일의 모든 패턴을 한 번에 일치 [복제]

2개의 파일이 있습니다: argstext.

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)

설명하다:

  1. 내부 루프는 사용 파일의 패턴 목록 while에서 하나 이상의 패턴과 일치하는 모든 행을 인쇄합니다.text.txtargs.txt
  2. 그런 다음 목록이 정렬되고( sort) 발생 횟수가 계산됩니다( uniq -c).
  3. 외부 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.

관련 정보