Câu trả lời:
Bạn có thể sử dụng sed
cho việc này. Trên BSD sed
:
echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
Hoặc, không có -E
tùy chọn:
sed "s/.*'\([^']\+\)'.*/\1/"
Điều này không làm việc cho đầu vào đa dòng. Cho rằng bạn cần:
sed -n "s/.*'\([^']\+\)'.*/\1/p"
( ) +
sử dụng \( \) \+
: Điều này thực sự giống nhau:sed "s/.*'\([^']\+\)'.*/\1/"
sed -n "s/.*'\([^']\+\)'.*/\1/p"
Mặc dù grep không thể xuất một nhóm cụ thể, bạn có thể sử dụng lookahead và đằng sau các xác nhận để đạt được những gì sau:
echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
grep -P
không có sẵn trên tất cả các nền tảng. Nhưng nếu có, sử dụng lookahead / đằng sau là một cách giải quyết vấn đề rất hay.