我有一系列符合以下两种模式之一的字符串:
("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。
答案 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