我正在尝试使用Shell脚本匹配包含引号序列的字符串的内容,当时我得到的是:
et="\"He\" \"llo\""
echo $et | sed -e '/\"(.*?)\"/g'
返回此内容:
“他”“llo”
但我不希望引号出现在结果上,我也不希望echo
只有第一个,第二个或第三个等匹配?
答案 0 :(得分:1)
sed -e 's/"\([^"]*\)"/\1/g'
会删除平衡"
引号周围的引号。要仅使用sed显示第一个,第二个匹配等,您可能必须创建不同的捕获组。
$ echo '"1" "2" "3"' | sed -e 's/"\([^"]*\)" "\([^"]*\)" "\([^"]*\)"/\2/g'
2
$
答案 1 :(得分:1)
如果想要的只是第一对引号之间的文本,这里是perl的解决方案:
echo $et | perl -ne '/"[^"]+"/ and print "$&\n";'
如果它们前面带有反斜杠,它也会处理带引号的引号:
echo $et | perl -ne '/"[^"\\]+(\\.[^"]*)*"/ and print "$&\n";'
答案 2 :(得分:0)
这对于awk
来说要简单得多,因为您可以将双引号指定为字段分隔符。
$ et='"He" "llo"'
$ awk -F'"' '{print $2}' <<<$et
He
$ awk -F'"' '{print $4}' <<<$et
llo
注意 :这也是可扩展的,字符串字段将是2的倍数,即$ 2,$ 4,$ 6等。
答案 3 :(得分:0)
您也可以这样做:
[srikanth@myhost ~]$ echo "\"He\" \"llo\"" | awk ' { match($0,/([A-Za-z]+)[" ]+([A-Za-z]+)/,a); print a[1]","a[2]} '
He,llo