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 r
fish
[...]
예반품정규식의 특수 연산자( [...]
glob 연산자와 매우 유사) 는 , , , 또는 가 grep '[myword]'
포함된 행과 일치합니다 . 따라서 for (정규식) 의 시작 부분 도 이스케이프해야 합니다 . 이는 또는 로 수행 할 수 있습니다 .m
y
w
o
r
d
[
grep
grep '\[myword]'
grep '[[]myword]'
^
또 다른 정규 표현식 연산자입니다. 즉, 줄의 시작 부분에서만 일치합니다. 따라서 grep '^\[myword]: '
로 시작하는 줄과 일치합니다 [myword]:
.
단지 grep
일치하는 행을 인쇄하기 위해(stream editor와 같은 스트림 편집기는 아님 sed
) GNU는 행의 일치하는 부분(비어 있지 않은 경우)을 인쇄하는 grep
비표준 옵션을 추가했습니다 . -o
또한 -P
none 대신 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