특정 패턴(다른 두 문자열 사이에 나타나는 문자열)과 일치하는 파일 목록을 인쇄해야 합니다. 어떻게 해야 하나요? 텍스트를 추출하고 싶지 않고 이 패턴과 일치하는 파일만 나열하고 싶습니다.
PREFETCH
advanced_override.begin
및 두 문자열 사이에 나타나는 문자열의 인스턴스를 포함하는 모든 파일 이름을 일치시키고 나열하는 명령이 필요합니다 advanced_override.end
. 이러한 파일은 모두 동일한 디렉터리에 존재하므로 이 명령은 현재 디렉터리 "."의 내용을 검색하고 지정된 패턴과 일치하는 파일 이름을 나열해야 합니다.
고쳐 쓰다:
다음과 같은 내용이 있어야 합니다 advanced_override.begin <lots of text> PREFTECH <lots of other text> advanced_override.end
. 이 두 문자열 사이의 특정 문자열을 일치시키려면 이 문자열이 필요하며 아마도 전후의 다른 많은 텍스트도 일치해야 합니다 PREFETCH
.
업데이트 2:
입력 파일은 XML 파일입니다. advanced_override.begin
로 시작하는 섹션은 advanced_override.end
많은 텍스트 줄을 포함하여 커질 수 있습니다.
답변1
pcregrep
가능한 경우 -l
스위치를 사용하여 일치하는 파일 이름만 나열할 수 있습니다.
pcregrep -lM '(?s)advanced_override\.begin.*PREFETCH.*advanced_override\.end' ./*
PREFETCH
여러 줄 모드에서 중간 두 문자열을 검색합니다. 현재 디렉터리에 텍스트 파일만 있다고 가정하고(그렇지 않은 경우 루프 for
또는 를 사용할 수 있음) 각 파일에는 다음으로 시작하고 끝나는 find
섹션이 포함되어 있다고 가정합니다 . 여러 섹션의 경우 부정 예측을 사용하는 것이 좋습니다. 예를 들면 다음 과 같습니다.advanced_override.begin
advanced_override.end
PREFETCH
pcregrep -lM '(?s)advanced_override\.begin(?:(?!advanced_override\.end).)*PREFETCH.*advanced_override\.end' ./*
답변2
위의 경고는,여기그리고여기, 하지만 특히여기정규식을 사용하여 XML 파일을 구문 분석하는 데 많은 관심이 있었습니다. 일반적으로 XML 텍스트는 한 줄로 제한되지 않을 수 있지만 이 경우 특정 단일 단어를 검색하고 그 단어 자체가 여러 줄로 나뉘지 않는다고 가정하면 간단한 awk 스크립트를 사용하여 "상태". 다음 예상 단어가 보이면 state
값이 증가합니다. 예상되는 모든 패턴을 올바른 순서로 찾으면 found
변수를 설정하고 해당 변수를 기반으로 반환 코드를 생성합니다.
#!/bin/sh
for f in *
do
awk '
/advanced_override\.begin/ { state=1; }
/PREFETCH/ && state == 1 { state=2; }
/advanced_override\.end/ && state == 2 { found=1; }
END {
if (found)
exit 0
else
exit 1
}
' "$f" && printf "Found in: %s\n" "$f"
done
다음 3개의 입력 파일 예시가 제공됩니다.
$ cat input1
junk
advanced_override.begin other text
other text
PREFETCH other text
other text
advanced_override.end
$ cat input2
just some stuff
advanced_override.end
$ cat input3
junk
advanced_override.begin other text other text PREFETCH other text other text advanced_override.end
junk
이 스크립트를 실행하면 다음이 생성됩니다.
Found in: input1
Found in: input3