특정 문자열 앞의 텍스트 추출

특정 문자열 앞의 텍스트 추출

한 줄에 한 단어씩 grep하려고합니다. 각 줄에 대해 grep 단어 이전에 발생하는 모든 내용을 인쇄하고 싶습니다.

예:

echo help.me.nc.example.com is an alias for fd-nc-001.domain.com.

내가 찾고 있는 것은 입니다 .nc. 그 이전의 모든 내용을 인쇄하고 싶습니다 help.me.

echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | awk '{print $6}'
fd-nc-001.domain.com.
echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | grep .nc | awk '{print $1}'
help.me.nc.example.com

답변1

그러면 문자열이 처음 나타나는 위치에서 입력 줄이 잘립니다 .nc.

sed 's/\.nc.*//'

(in 안의 점은 .nc이스케이프 처리해야 합니다. 그렇지 않으면 단일 문자와 일치합니다. .*이후 \.nc는 줄의 나머지 부분과 일치합니다.)

또한 입력 줄에 문자열이 포함되어 있지 않으면 아무것도 출력하지 않습니다 .nc(또는 대체를 수행할 때 무언가만 출력하고 줄에 문자열이 포함되어 있으면 무언가를 출력합니다).

sed -n 's/\.nc.*//p'

-n옵션은 sed각 주기가 끝날 때 버퍼의 기본 출력을 비활성화합니다. 대신, p교체 명령에 추가된 플래그는 교체가 트리거될 때마다 명시적인 출력을 수행합니다.

예:

$ echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | sed 's/\.nc.*//'
help.me
$ echo help.me.XX.example.com is an alias for fd-nc-001.domain.com. | sed 's/\.nc.*//'
help.me.XX.example.com is an alias for fd-nc-001.domain.com.
$ echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | sed -n 's/\.nc.*//p'
help.me
$ echo help.me.XX.example.com is an alias for fd-nc-001.domain.com. | sed -n 's/\.nc.*//p'

(마지막 명령에는 출력이 없습니다.)


sed -n 's/\.nc.*//p'다음을 사용하는 것과 동일한 작업을 수행합니다 awk.

awk 'sub(/\.nc.*/, "")'

(모든 줄에서 대체를 수행하려고 시도하지만 sub()명령에 사용된 패턴이 일치하는 경우에만 결과를 인쇄합니다.)

같은 일이지만 다음만 사용합니다 pcre2grep.

pcre2grep -o '.*?(*positive_lookahead:\.nc)'

(줄의 시작 부분과 문자열을 제외한 모든 항목과 일치합니다 .nc.)

위 의 대신 (*pla:, 또는 더 비밀스럽게 를 사용할 수 있습니다 . GNU가 있는 경우 이전 명령에서 대신 사용할 수 있습니다 .(?=(*positive_lookahead:grepgrep -Ppcre2grep

답변2

.nc나는 당신이 정말로 원하는 것이 줄 뒤나 끝에서 찾는 것이고 ., 각 줄에서 문자가 처음 나타나는 부분(마지막 부분이 아닌)을 일치시키려는 것이라고 생각합니다. 이는 그 중 하나입니다(예제 입력을 사용하여 .nc하위 문자열이 아닌 입력에 한 번 나타나는 경우 보다 더 많은 것을 테스트함 ).

$ echo 'help.ncc1701.nc.foo.nc.com' | sed -E 's/\.nc(\..*|$)//'
help.ncc1701

$ echo 'help.ncc1701.nc.foo.nc.com' | awk 'sub(/\.nc(\..*|$)/,"")'
help.ncc1701

sed 명령은 -EGNU 또는 BSD sed와 같은 ERE 지원 sed를 지원해야 하며 awk 명령은 모든 awk에서 작동합니다.

관련 정보