我想匹配的是包含使用Shell脚本引号序列的字符串的内容,在当时远我是这样的:得到一个指定的比赛在一个字符串
et="\"He\" \"llo\""
echo $et | sed -e '/\"(.*?)\"/g'
它返回这个:
“他”,“LLO”
但我不希望引号出现在结果,还哪能echo
只有第一或第二,或THI rd等比赛?
我想匹配的是包含使用Shell脚本引号序列的字符串的内容,在当时远我是这样的:得到一个指定的比赛在一个字符串
et="\"He\" \"llo\""
echo $et | sed -e '/\"(.*?)\"/g'
它返回这个:
“他”,“LLO”
但我不希望引号出现在结果,还哪能echo
只有第一或第二,或THI rd等比赛?
这是awk
更加简单,因为你可以指定双引号是字段分隔符。
$ et='"He" "llo"'
$ awk -F'"' '{print $2}' <<<$et
He
$ awk -F'"' '{print $4}' <<<$et
llo
注:这也是可扩展性和琴弦领域将是二的倍数,即$ 2,$ 4,$ 6等
非常感谢!这比在正则表达式中使用'sed'更容易(也是可以理解的)。你能解释为什么它使用两倍的倍数? – 2012-01-07 22:47:14
因为awk会在每个“分开的部分”,“他,”和“llo”分裂。 – 2012-01-08 00:06:59
对不起,第一部分将是一个空字符串 – 2012-01-08 00:44:20
sed -e 's/"\([^"]*\)"/\1/g'
将删除平衡"
报价。为了仅用sed显示第一个,第二个匹配等,您可能必须创建不同的捕获组。
$ echo '"1" "2" "3"' | sed -e 's/"\([^"]*\)" "\([^"]*\)" "\([^"]*\)"/\2/g'
2
$
提供的,什么是想要的仅仅是第一对引号之间的文本,这里是用Perl的解决方案:
这也将处理witin行情报价,如果他们前面有一个反斜线:
echo $et | perl -ne '/"[^"\\]+(\\.[^"]*)*"/ and print "$&\n";'
你也可以做这样的事情:
[[email protected] ~]$ echo "\"He\" \"llo\"" | awk ' { match($0,/([A-Za-z]+)[" ]+([A-Za-z]+)/,a); print a[1]","a[2]} '
He,llo
你的意思是说,在“他”“世界”的“他”,你想要'他'和'世界'作为输出? – fge 2012-01-07 18:14:15