문자열에서 단어의 특정 인스턴스를 분리합니다.

문자열에서 단어의 특정 인스턴스를 분리합니다.

grep문자열을 처리하는 명령이 있습니다

test-test test

test명령이 강조 표시된 "independent"라는 단어만 표시하고 싶습니다 test-test.

그러나 내가 달릴 때

echo "test-test test" | grep -w "test"

나는 test일어난 모든 일을 강조했습니다.

고립된 발생으로만 일치 항목을 제한할 수 있습니까 test?

답변1

단어는 영숫자와 밑줄 등 단어가 아닌 문자로 구분된 일련의 단어 문자이기 때문에 모든 test항목이 굵게 표시됩니다 . 단어 문자가 아닙니다.-w-

에서는 testing-test+test2;test_3;untested두 번째 항목만 test앞뒤에 단어 문자가 없기 때문에 일치합니다.

공백으로 구분된 단어를 일치시키려면 다음을 지정해야 합니다.주위를 둘러보세요grep수동 어설션 및 모든 구현이 지원하지 않는 기능을 위해 Perl 호환 정규식이 필요합니다 . grep='grep --color별칭이 있는 것 같으므로 / 옵션을 grep지원 하는 경우 --color해당 옵션도 지원할 수 있습니다. 그러면 다음을 수행할 수 있습니다.-P-X perl

grep --color -P '(?<!\S)test(?!\S)'

(?<!...)그리고 (?!...)각각Perl 정규 표현식의 부정형 뒤돌아보기 및 미리보기 어설션 연산자. , POSIX 일치 및 공백이 아닌 문자 \S와 같습니다 . [^[:space:]]즉, " test공백이 아닌 문자가 앞이나 뒤에 오지 않는 한 일치합니다."

답변2

Perl 정규식( -P플래그와 함께 GNU grep에서 지원됨)을 사용하면 부정적인 뒤돌아보기 및 미리보기를 사용하여 test인접하지 않은 일치 항목을 주장할 수 있습니다 -.

echo "test-test test" | grep -P '(?<!-)test(?!-)'

이 출력

시험을 받다시험

답변3

확장 정규식을 사용하면 다음과 같이 구현할 수 있습니다.

grep -E "(^| )test( |$)"

이는 실제로 선행 또는 훈련 공간을 강조 표시하지만 인쇄 가능한 문자가 아니기 때문에 표시되지 않습니다.

답변4

사용진주:

~$ echo "test-test test\ntest\n\n" | perl -lpe 's/(?<!\S)(test)(?!\S)/**$1**/g;'
test-test **test**
**test**


사용행복하다:

~$ echo "test-test test\ntest\n\n" | raku -pe 's:g/ <!after \S > (test) <!before \S >  /**$0**/;'
test-test **test**
**test**


[ 답변 grep에서 Perl 스타일 Lookaround에 대해 자세히 설명한 @StéphaneChazelas에게 특별히 감사드립니다.]

강조 표시와 비슷한 것을 원한다면 여기에 간단한 아이디어가 있습니다.펄 몽크스. grepPerl/Raku를 사용하고 색상 옵션 대신 별표로 일치 항목을 둘러쌉니다 **.

afterRaku 참고: Raku에서는 Lookbehinds의 철자가 긍정적이고 부정적인 ?반면, Lookaheads의 철자는 Raku의 긍정적인 및 부정적입니다 !. 따라서 위의 Raku 코드를 직접 읽을 수 있습니다.before?!after" 공백이 아닌 문자나 공백이 아닌 문자가 아닌 "test"라는 단어의 발생을 전역적으로 바꿉니다 before...".

https://perldoc.perl.org/perlre#Lookaround-Assertions
https://docs.raku.org/언어/regexes#Lookahead_assertions
https://docs.raku.org/언어/regexes#Lookbehind_assertions

관련 정보