쉘 스크립트의 한 줄에서 단어를 추출해야 합니다. 비슷한 예를 본 적이 있지만 그 중 아무 것도 작동하지 않았습니다.
예를 들어보세요
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
행의 일치하는 부분만 반환하고 -P
PCRE(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 |
K Lookbehind 어설션을 사용하여 더 짧은 대안으로 일치 시작(ept)을 재설정합니다 .주위를 둘러보세요그리고정규식에서 K 지원 |
( |
\1(1회 이상(최대한 많이 일치))로 그룹화 및 캡처: |
\w+ |
단어 문자(az, AZ, 0-9, _)(1회 이상(최대한 많이 일치)) |
[/\.] |
모든 문자: "/", "." |
)+ |
\1의 끝(참고: 이 캡처에 수량자를 사용하고 있으므로 캡처 패턴의 마지막 반복만 \1에 저장됩니다.) |
\w+ |
단어 문자(az, AZ, 0-9, _)(1회 이상(최대한 많이 일치)) |