Shell은 부분 패턴과 일치하는 완전한 단어를 추출합니다.

Shell은 부분 패턴과 일치하는 완전한 단어를 추출합니다.

쉘 스크립트의 한 줄에서 단어를 추출해야 합니다. 비슷한 예를 본 적이 있지만 그 중 아무 것도 작동하지 않았습니다.

예를 들어보세요

word1 word2 word3/pattern/word4.word5 word6

양쪽에 공백을 pattern반환하지 않아야 한다는 점을 고려하면 .word3/pattern/word4.word5

또한 줄이 특정 문자로 시작하는 것을 제한해야 합니다 #.

줄을 분리하는 grep 명령을 찾았습니다.

grep "^[^#].*pattern" $FILE

로 시작하지 않고 를 #포함하는 모든 줄을 반환합니다 pattern. 그러면 이 줄에서 이 단어를 어떻게 추출할 수 있나요?

편집 : 우분투 20.04 사용

또한 이 문장과 관련하여 이 예는 그것이 되어야 하는 것과 어느 정도 관련이 있습니다. 이 패턴은 한 줄에 최대 한 번만 발생하며 다른 단어와 공백으로 구분됩니다. 한 줄이 주어지면 패턴이 포함된 단어를 반환하고 공백(공백 제외)을 만날 때까지 모든 것을 왼쪽과 오른쪽으로 이동하고 싶습니다.

답변1

패턴이 공백과 일치하지 않는 한 이 grep -o '[^[:space:]]*pattern[^[:space:]]*'작업을 수행해야 합니다 . ( [^[:space:]]*공백이 아닌 문자와 일치합니다.)

정규식 엔진은 일반적으로 가장 왼쪽 위치에서 시작하여 일치 항목을 찾고, 일치 항목은 탐욕적입니다. 즉, 가능한 한 많은 문자열과 일치합니다. 따라서 패턴의 양쪽에 공백이 아닌 모든 공백이 여기에서 선택되어야 합니다.

해시 기호로 시작하는 줄을 무시하려면 파이프하면 됩니다 grep -v "^#".

예를 들어 다음을 hello.txt포함하는 경우

# my pattern
word1 word2 word3/pattern/word4.word5 word6

그 다음에:

% < hello.txt grep -v "^#" | grep -o '[^[:space:]]*pattern[^[:space:]]*'
word3/pattern/word4.word5

답변2

또 다른 GNU grep접근 방식:

grep -oP '^[^#].*\K\S*pattern\S*" "$file"

-o플래그는 grep행의 일치하는 부분만 반환하고 -PPCRE(Perl Compatible Regular Expressions)를 활성화하여 -K"지금까지 일치된 모든 항목을 잊어버립니다". 이를 통해 ^[^#]" #줄의 시작 부분에 있는 a를 제외한 모든 문자와 일치"를 사용할 수 있지만 결과의 시작 부분에서 모든 문자가 제외됩니다. PCRE는 또한 \S"공백 없음"을 제공합니다.

요약하자면, 이는 #a로 시작하지 않고 포함된 행과 일치 pattern한 다음 해당 패턴을 포함하는 공백이 아닌 가장 긴 문자열을 인쇄합니다.

동일한 줄에 여러 항목이 있는 경우 pattern이전 .*항목과 가장 일치하는 항목이 반환됩니다 \K. 가장 왼쪽 일치 항목을 반환하려면 다음을 사용하세요.

grep -oP '^[^#].*?\K\S*pattern\S*' file

답변3

그리고암소 비슷한 일종의 영양 grep:

grep -oP '^(?<!#).*?\K(\w+[/\.])+\w+' file
word3/pattern/word4.word5

정규식 일치는 다음과 같습니다.

마디 설명하다
^ 문자열의 시작
(?<! 뒤를 봐다음이 있는지 확인하세요.
# #
) 뒷모습 끝
.*? \n을 제외한 모든 문자(0회 이상(가능한 한 적게 일치))
\K KLookbehind 어설션을 사용하여 더 짧은 대안으로 일치 시작(ept)을 재설정합니다 .주위를 둘러보세요그리고정규식에서 K 지원
( \1(1회 이상(최대한 많이 일치))로 그룹화 및 캡처:
\w+ 단어 문자(az, AZ, 0-9, _)(1회 이상(최대한 많이 일치))
[/\.] 모든 문자: "/", "."
)+ \1의 끝(참고: 이 캡처에 수량자를 사용하고 있으므로 캡처 패턴의 마지막 반복만 \1에 저장됩니다.)
\w+ 단어 문자(az, AZ, 0-9, _)(1회 이상(최대한 많이 일치))

관련 정보