我想匹配的是包含使用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