2017-02-15 63 views
1

我想提取在/etc/lvm/lvm.conf中配置的筛选规则,如filter = [ "r|/dev/sda|" ]。我想sed返回"r|/dev/sda|"。所以,我曾尝试下面的脚本:Sed未能匹配非空白字符与字符分类

echo ' filter = [ "r|/dev/sda|" ] ' | sed -r 's:^\s*filter\s*=\s*\[\s*([^\s]+)\s*\]:\1:g'

但它没有工作,脚本返回filter = [ "r|/dev/sda|" ]。 我已经尝试了一些线上正则表达式测试仪,该组已被正确匹配。

但是,如果我用.+代替[^\s]+,它就可以工作。

不是[^\s]+是指多个非空白字符

有什么想法吗?

+1

这些速记不能否定括号表达式内部使用。 '[^ [:space:]]'会起作用。 –

+0

是的!谢谢你,非常感谢你,@WiktorStribiżew – vesontio

+0

万一你用'grep'确定:try'grep -oP'filter。* \ K“。*?'''inputfile' –

回答

3

Acc。到regular-expressions.info

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

因此,你需要用[^[:space:]]比空白其他任何字符),以取代[^\s]

Example

echo ' filter = [ "r|/dev/sda|" ] ' | sed -E 's:^\s*filter\s*=\s*\[\s*([^[:space:]]+)\s*\]:\1:g' 

输出:"r|/dev/sda|"

1

在壳体的grep溶液是可以接受的:

grep -oP 'filter.*\K".*?"' inputfile 
1

可选地更容易和比[^[:space:]]较短可以用\S+做而不使用括号[]

\S装置空白字符

echo ' filter = [ "r|/dev/sda|" ] ' | sed -r 's:^\s*filter\s*=\s*\[\s*(\S+)\s*\]:\1:g' 

​​

+0

谢谢@Grisza,的确,这也是一个很好的解决方案。 – vesontio