我想提取/etc/lvm/lvm.conf
中配置的过滤规则,例如filter = [ "r|/dev/sda|" ]
。我希望sed
返回"r|/dev/sda|"
。所以我尝试了以下脚本:
echo ' filter = [ "r|/dev/sda|" ] ' | sed -r 's:^\s*filter\s*=\s*\[\s*([^\s]+)\s*\]:\1:g'
但它没有用,脚本已经返回filter = [ "r|/dev/sda|" ]
。
我已经尝试了一些在线正则表达式测试仪,该组已经正确匹配。
但是,如果我将[^\s]+
替换为.+
,则可行。
不是[^\s]+
是指多个非空白字符吗?
请问好吗?
答案 0 :(得分:3)
度Acc。到regular-expressions.info:
一个关键的语法区别是反斜杠不是POSIX括号表达式中的元字符。所以在POSIX中,正则表达式
[\d]
匹配\
或d
。
因此,您需要将[^\s]
替换为[^[:space:]]
(除空格以外的任何字符)。
echo ' filter = [ "r|/dev/sda|" ] ' | sed -E 's:^\s*filter\s*=\s*\[\s*([^[:space:]]+)\s*\]:\1:g'
输出:"r|/dev/sda|"
答案 1 :(得分:1)
如果grep解决方案可以接受:
grep -oP 'filter.*\K".*?"' inputfile
答案 2 :(得分:1)
或者使用[^[:space:]]
\S+
更简单,更短,而不使用括号[]
\S
表示非空白字符
echo ' filter = [ "r|/dev/sda|" ] ' | sed -r 's:^\s*filter\s*=\s*\[\s*(\S+)\s*\]:\1:g'