2012-01-07 46 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