2015-11-17 108 views
1

我有一個範圍,其符合以下兩個patters之一串:SED正則表達式提取

("string with spaces",4)(string_without_spaces,4)

我需要通過bash命令提取「串」,和到目前爲止,已經找到了適用於每種模式的模式,但兩者都不適用。

echo "(\"string with spaces\",4)" | sed -n 's/("\(.*\)",.*)/\1/ip'

輸出:string with spaces

echo "(string_without_spaces,4)" | sed -n 's/(\(.*\),.*)/\1/ip'

輸出:

string_without_spaces

我一直在使用"\?但它不匹配"如果是有企圖echo "(SIM,0)" | sed -n 's/("\?\(.*\)"\?,.*)/\1/ip'

輸出:SIM

echo "(\"SIM\",0)" | sed -n 's/("\?\(.*\)"\?,.*)/\1/ip'

輸出:SIM"

任何人都可以建議將提取這兩種情況下字符串的模式?我沒有綁定到sed,但寧願不必在此環境中安裝perl。

回答

1

如何使用[^"]而不是.排除"以匹配。

$ echo '("string with spaces",4)' | sed -n 's/("\?\([^"]*\)"\?,.*)/\1/p' 
string with spaces 
$ echo "(string_without_spaces,4)" | sed -n 's/("\?\([^"]*\)"\?,.*)/\1/p' 
string_without_spaces 

$ echo "(SIM,0)" | sed -n 's/("\?\([^"]*\)"\?,.*)/\1/p' 
SIM 
$ echo '("SIM",0)' | sed -n 's/("\?\([^"]*\)"\?,.*)/\1/p' 
SIM