2012-01-07 73 views
0

我想匹配的是包含使用Shell脚本引号序列的字符串的内容,在当时远我是这样的:得到一个指定的比赛在一个字符串

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

它返回这个:

“他”,“LLO”

但我不希望引号出现在结果,还哪能echo只有第一或第二,或THI rd等比赛?

+0

你的意思是说,在“他”“世界”的“他”,你想要'他'和'世界'作为输出? – fge 2012-01-07 18:14:15

回答

0

这是awk更加简单,因为你可以指定双引号是字段分隔符。

$ et='"He" "llo"' 
$ awk -F'"' '{print $2}' <<<$et 
He 
$ awk -F'"' '{print $4}' <<<$et 
llo 

:这也是可扩展性和琴弦领域将是二的倍数,即$ 2,$ 4,$ 6等

+0

非常感谢!这比在正则表达式中使用'sed'更容易(也是可以理解的)。你能解释为什么它使用两倍的倍数? – 2012-01-07 22:47:14

+0

因为awk会在每个“分开的部分”,“他,”和“llo”分裂。 – 2012-01-08 00:06:59

+0

对不起,第一部分将是一个空字符串 – 2012-01-08 00:44:20

1

sed -e 's/"\([^"]*\)"/\1/g'将删除平衡"报价。为了仅用sed显示第一个,第二个匹配等,您可能必须创建不同的捕获组。

$ echo '"1" "2" "3"' | sed -e 's/"\([^"]*\)" "\([^"]*\)" "\([^"]*\)"/\2/g' 
2 
$ 
1

提供的,什么是想要的仅仅是第一对引号之间的文本,这里是用Perl的解决方案:

这也将处理witin行情报价,如果他们前面有一个反斜线:

echo $et | perl -ne '/"[^"\\]+(\\.[^"]*)*"/ and print "$&\n";' 
0

你也可以做这样的事情:

[[email protected] ~]$ echo "\"He\" \"llo\"" | awk ' { match($0,/([A-Za-z]+)[" ]+([A-Za-z]+)/,a); print a[1]","a[2]} ' 
He,llo 
相关问题