grep 에 제공하려는 파일(패턴 파일)이 있고 -f
문자열이 있는 다른 파일(검색 파일)에서 일치하는 항목을 찾고 싶습니다.에 의해. . 시작주어진 패턴. 예를 들어:
스키마 파일
1234
qwerty
chicken
파일 검색
12345
543212345
qwerty
1fwf32sgww
chicken fingers
위 파일이 주어지면 grep은 다음 줄을 반환해야 합니다.
12345
qwerty
chicken fingers
어떻게 해야 합니까?
답변1
전달하려는 ^
내용을 모든 줄 앞에 추가 할 수 있습니다 .PATERN_FILE
grep -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
@a
put
any
@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
그러나 이는 스키마 파일을 수정하므로 원래 목록을 변경하지 않는 솔루션을 선호합니다.