GNU grep을 사용하여 표현식에서 일치하는 그룹을 얻을 수 있습니까?
예:
echo "foo 'bar'" | grep -oE "'([^']+)'"
" 'bar'"를 출력 할 것입니다. 그러나 나는 한 번 더 grep을 보내지 않고 "바"를 얻고 싶습니다 (즉, 일치하는 그룹을 얻습니다). 가능합니까?
이를 위해 sed
를 사용할 수 있습니다. BSD sed
에서 :
echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
또는 -E
옵션 :
sed "s/.*'\([^']\+\)'.*/\1/"
여러 줄 입력에는 작동하지 않습니다. 이를 위해서는 다음이 필요합니다.
sed -n "s/.*'\([^']\+\)'.*/\1/p"
Grep이 특정 그룹을 출력 할 수는 없지만 lookahead 및 뒤에 어설 션을 사용하여 이후를 수행 할 수 있습니다.
echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
당신이 사용할 수있는 \K
일치하는 텍스트에 추가되지 않은 lookahead와 함께 왼쪽 일치하는 텍스트를 재설정하고 삭제하려면 다음을 수행하십시오.
$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar
GNU grep 만 해당합니다.