sed正则表达式提取

时间:2015-11-17 05:51:52

标签: regex bash 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"

输出:{{1}}

任何人都可以建议在两种情况下提取字符串的模式吗?我不喜欢sed,但更愿意不必在这种环境中安装perl。

1 个答案:

答案 0 :(得分: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