[단어] 뒤에만 텍스트를 입력하세요:

[단어] 뒤에만 텍스트를 입력하세요:

example.txt다음 텍스트가 포함된 파일이 있습니다.

[one]: bla bla bla onebla twobla
[two]: hey heya noheya
[onemore]: i got mad and etc

다음 텍스트만 grep하고 표시해야 합니다 [myword]. 다음 방법으로 테스트해 보세요.

grep [myword] /tmp/example.txt | cut -d ':' -f 2

각 항목마다 [myword]괄호 뒤의 모든 내용이 인쇄됩니다. 하지만 전체 대신 필요한 것만 얻을 수 있는 방법은 무엇입니까?

특정 괄호 뒤에 테스트를 인쇄하면 됩니다. 예를 들어, 줄 뒤의 텍스트 가 아닌 [one]: 줄 안의 텍스트만 인쇄하여 모든 것을 인쇄하려면 올바른 출력은 다음과 같아야 합니다 .[two]:[onemore]:bla bla bla onebla twobla[onemore]:i got mad and etc

답변1

더 좋은 점은 다음과 같습니다 sed.

sed -n 's/^\[one]: //p' < example.txt

grep최신 PCRE를 지원하는 GNU를 사용하면 다음 작업도 수행할 수 있습니다.

grep -Po '^\[one]: \K.*' < example.txt

또는

grep -xPo '\[one]: \K.*' < example.txt

어쨌든, 대부분의 쉘에서는 [...]glob 연산자라는 점에 유의하십시오. in 에서는 grep [myword]해당 [myword]파일과 일치하는 파일 목록으로 확장됩니다. 즉, 현재 디렉터리에 m, y, w, o또는 r이라는 이름의 파일이 d없으면 패턴은 있는 그대로 전달되거나 grep다음에 따라 오류가 발생합니다. 껍질) . 따라서 셸에서는 이를 인용해야 합니다(예: 여기 솔루션에 표시된 것처럼 작은따옴표 사용). 예를 들어, r현재 디렉터리에 이라는 파일이 있고, 이라는 파일이 있다면 d, Except 이라는 파일이 grep [myword]있을 것입니다 .grep d rfish

[...]반품정규식의 특수 연산자( [...]glob 연산자와 매우 유사) 는 , , , 또는 가 grep '[myword]'포함된 행과 일치합니다 . 따라서 for (정규식) 의 시작 부분 도 이스케이프해야 합니다 . 이는 또는 로 수행 할 수 있습니다 .myword[grepgrep '\[myword]'grep '[[]myword]'

^또 다른 정규 표현식 연산자입니다. 즉, 줄의 시작 부분에서만 일치합니다. 따라서 grep '^\[myword]: '로 시작하는 줄과 일치합니다 [myword]:.

단지 grep일치하는 행을 인쇄하기 위해(stream editor와 같은 스트림 편집기는 아님 sed) GNU는 행의 일치하는 부분(비어 있지 않은 경우)을 인쇄하는 grep비표준 옵션을 추가했습니다 . -o또한 -Pnone 대신 Perl 호환 정규식(PCRE에서)을 사용하는 옵션을 추가합니다 -P.

최근 PCRE에서는 \K연산자초기화일치 섹션의 시작 부분입니다. 그래서 grep -Po '^\[one]: \K.*'우리는 일치 부분을 인쇄합니다 -o. 왜냐하면 일치 부분은 \K이후에 발견된 문자의 시퀀스가 ​​되기 때문입니다( )..*[one]:

답변2

구분 기호 독립적 솔루션을 원한다면 다음을 사용하십시오.awk

$ cat 304162 
[one]: bla bla bla onebla twobla
[two]: hey heya noheya
[onemore]: i got mad and etc
[fourth:one]: some more bla, well ! worst case
$ awk '/\[onemore\]/{sub(/^[^]]*\]:[[:blank:]]*/,"");print}' 304162
i got mad and etc
$ awk '/\[fourth:one\]/{sub(/^[^]]*\]:[[:blank:]]*/,"");print}' 304162
some more bla, well ! worst case

답변3

[one]o정규 표현식은 " or n또는 . 과 일치하는 e문자가
grep [one] /tmp/example.txt 예제의 모든 행과 일치함을 의미합니다.

문자로 일치시키려면 []해당 문자를 이스케이프 처리해야 합니다.

grep \\[one\\] /tmp/example.txt   | cut -d ':' -f 2

grep -F또는 정규식 구문 무시를 사용할 수 있습니다 .

grep -F [one] /tmp/example.txt | cut -d ':' -f 2

관련 정보