2013-05-21 106 views
0

我正在編寫一個shell腳本,它將查找並替換一行以禁用nscd中的密碼緩存。問題是,在參數之前和之間存在大量的空白空間,我似乎無法用我有限的正則表達式的知識來找到一種方式來忽略空格,並將「否」更改爲「是」。sed用空格查找/替換行

下面是它在配置文件中出現的那一行。以防萬一它無法正常顯示,在enable-cache之前有8個空格,之前有12個空格,在沒有之前有10個空格。

enable-cache   passwd   no 

我基本上只需要將該行的no改爲yes。任何人有任何想法?

感謝

格雷格

回答

1

要顯示一個完整的使用例子(儘管在命令行,而不是從文件中給定的輸入):

$ sed -r -e \ 
    's/^([[:space:]]*enable-cache[[:space:]]+passwd[[:space:]]+)no([[:space:]]*)$/\1yes\2/' \ 
    <input-file >output-file \ 
    && mv output-file input-file 

要就地做到這一點,你想要使用edex(兩者,不同於sed -i,是POSIX指定的工具):

$ printf '%s\n' \ 
    '%s/\([[:space:]]*enable-cache[[:space:]]\+passwd[[:space:]]\+\)no[[:space:]]*/\1yes/' \ 
    'wq' \ 
    | ex file-to-modify -s - 
+0

使用'sed的-i(...)file'取代'mv' – yoones

+0

@yoones負。 'sed -i'不符合POSIX標準。請參閱http://pubs.opengroup.org/onlinepubs/007904875/utilities/sed.html –

+0

@yoones ...如果您想要一個符合POSIX標準的工具進行現場編輯,那將是預編譯的,而不是sed 。 –

0

匹配並捕獲從enable-cache開始的部分,最大爲no,也匹配no。與捕獲部分和yes替換所有匹配的部分:

sed 's/\(enable-cache[ ]*passwd[ ]*\)no/\1yes/' input 
+0

由於允許原始文件使用製表符而不是空格(在問題中指定爲「空白」,並給出了nscd的配置文件不會選擇骨骼的帶外知識),因此編寫假定只有空格字符的代碼似乎有點危險。 –