web-development-kb-ko.site

GNU Grep이 선택된 그룹을 출력 할 수 있습니까?

GNU grep을 사용하여 표현식에서 일치하는 그룹을 얻을 수 있습니까?

예:

echo "foo 'bar'" | grep -oE "'([^']+)'"

" 'bar'"를 출력 할 것입니다. 그러나 나는 한 번 더 grep을 보내지 않고 "바"를 얻고 싶습니다 (즉, 일치하는 그룹을 얻습니다). 가능합니까?

48
Torandi

이를 위해 sed를 사용할 수 있습니다. BSD sed에서 :

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"

또는 -E 옵션 :

sed "s/.*'\([^']\+\)'.*/\1/"

여러 줄 입력에는 작동하지 않습니다. 이를 위해서는 다음이 필요합니다.

sed -n "s/.*'\([^']\+\)'.*/\1/p"
50
jtbandes

Grep이 특정 그룹을 출력 할 수는 없지만 lookahead 및 뒤에 어설 션을 사용하여 이후를 수행 할 수 있습니다.

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"

28
Aldrik

당신이 사용할 수있는 \K 일치하는 텍스트에 추가되지 않은 lookahead와 함께 왼쪽 일치하는 텍스트를 재설정하고 삭제하려면 다음을 수행하십시오.

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

GNU grep 만 해당합니다.

4
drewk