Sed无法将非空白字符与字符类匹配

时间:2017-02-15 12:53:12

标签: regex linux sed

我想提取/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]+是指多个非空白字符吗?

请问好吗?

3 个答案:

答案 0 :(得分:3)

度Acc。到regular-expressions.info

  

一个关键的语法区别是反斜杠不是POSIX括号表达式中的元字符。所以在POSIX中,正则表达式[\d]匹配\d

因此,您需要将[^\s]替换为[^[:space:]]除空格以外的任何字符)。

Example

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'

https://ideone.com/PxDX1Q