在字符串下获取指定的匹配

时间:2012-01-07 17:37:06

标签: regex bash shell

我正在尝试使用Shell脚本匹配包含引号序列的字符串的内容,当时我得到的是:

et="\"He\" \"llo\""
echo $et | sed -e '/\"(.*?)\"/g'

返回此内容:

  

“他”“llo”

但我不希望引号出现在结果上,我也不希望echo只有第一个,第二个或第三个等匹配?

4 个答案:

答案 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