2017-02-15 102 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