Grep은 패턴 파일에서 문자열로 시작하는 줄을 찾습니다.

Grep은 패턴 파일에서 문자열로 시작하는 줄을 찾습니다.

grep 에 제공하려는 파일(패턴 파일)이 있고 -f문자열이 있는 다른 파일(검색 파일)에서 일치하는 항목을 찾고 싶습니다.에 의해. . 시작주어진 패턴. 예를 들어:

스키마 파일

1234
qwerty
chicken

파일 검색

12345
543212345
qwerty
1fwf32sgww
chicken fingers

위 파일이 주어지면 grep은 다음 줄을 반환해야 합니다.

12345
qwerty
chicken fingers

어떻게 해야 합니까?

답변1

전달하려는 ^내용을 모든 줄 앞에 추가 할 수 있습니다 .PATERN_FILEgrep -f

paste -d '^' /dev/null PATTERN_FILE | grep -f - SEARCH_FILE

아니면 sed 's/^/^/' PATTERN_FILE대신 paste.

이제 의 행이 기본 정규 표현식이 아닌 고정 문자열인 경우 PATTERN_FILE모든 정규 표현식 연산자도 이스케이프해야 합니다.

sed 's/[][$^*\\.]/\\&/g; s/^/^/' PATTERN_FILE | grep -f - SEARCH_FILE

답변2

대안: grep 대신 awk를 사용하여 일치를 수행할 수 있습니다.

awk 'NR==FNR{a[$0];next} {for(t in a) if(substr($0,1,length(t))==t){print;next}}' needles haystack

이는 grep에서 정규식 엔진의 오버헤드를 방지하지만 awk의 해석 오버헤드가 있습니다. 어느 것이 더 잘 작동하는지 잘 모르겠습니다.

답변3

사용행복하다(이전 Perl_6)

~$ raku -ne 'BEGIN my @a = "/path/to/pattern_file.txt".IO.lines;  \
             .put if .starts-with( any @a );'  search_file.txt

#OR

~$ raku -ne 'BEGIN my @a = "/path/to/pattern_file.txt".IO.lines;  \
             .put if .starts-with( [|] @a );'  search_file.txt

위 내용은 Perl 계열의 프로그래밍 언어인 Raku로 작성된 답변입니다. 이것이 pattern_file.txt기본 정규 표현식이 아닌 고정 문자열이라고 가정하면 Raku에는 starts-with및 와 같은 문자열 일치 기능이 있습니다 ends-with. 레쿠도 있어요교차로any, all, 처럼 이 매칭 문제를 단순화할 수 있습니다 one.none

위에서는 -ne비자동 인쇄 명령줄 플래그가 사용되어 입력 파일을 한 줄씩 읽습니다. 블록 의 배열 로 BEGIN읽어 들입니다 . 코드 본문에서 (첫 번째 답변) 요소로 시작하면 입력 줄이 종료됩니다 . 또는 (두 번째 답변) Raku의 축소 메타 연산자 표기법을 사용하여 개념적으로 다음을 삽입합니다.pattern_file.txt@aputany@a[ ]| 또는요소 사이의 연산자 @a. 첫 번째와 두 번째 답변은 동일한 결과를 제공합니다.

입력 예:

pattern_file.txt

    1234
    qwerty
    chicken

search_file.txt

    12345
    543212345
    qwerty
    1fwf32sgww
    chicken fingers

예제 출력:

    12345
    qwerty
    chicken fingers

one참고: 조인 포인트(또는 동등한 [^]축소 메타 연산자)가 동일한 작업을 수행한다고 생각하기 쉽지만 이는 patterns_file.txt각 행이 고유한 경우에만 해당됩니다!

https://docs.raku.org/routine/starts-with
https://docs.raku.org/type/Junction
https://docs.raku.org/언어/operators#Reduction_metaoperators
https://raku.org

답변4

이를 수행하는 한 가지 옵션은 먼저 아래와 같은 명령을 사용하여 ^각 줄의 시작 부분에 문자를 추가하여 패턴 파일을 수정하는 것입니다. 그러면 grep이 정규식을 통해 줄의 시작 부분만 일치하도록 지시합니다.

awk '{print "^" $0}' PATTERN_FILE

그러나 이는 스키마 파일을 수정하므로 원래 목록을 변경하지 않는 솔루션을 선호합니다.

관련 정보