2017-07-29 37 views
0

問題發表評論的一行:在my.cnf文件有一條線,看起來像這樣:不能在my.cnf

... 
bind-address  = 127.0.0.1 
... 

,必須註釋掉。我試圖用這個sed:

sed -i 's/^[\s\t]*\(bind-address[\s\t]+=.*\)/#$1/g' my.cnf 

但由於某種原因它不起作用。

回答

5
sed -i 's/^[\s\t]*\(bind-address[\s\t]+=.*\)/#$1/g' my.cnf 

有幾個失誤

  • [\s\t]不會因爲\s工作是不是裏面[]認可和\s反正覆蓋\t
  • +需要被轉義爲BRE是默認的,除非使用-E(不應該逃脫3210應該是不需要\1
  • g因爲可以有每行只有唯一的匹配這個表達式

所以,這是修改後的版本

sed -i 's/^\s*\(bind-address\s\+=.*\)/#\1/' my.cnf 

或使用ERE

sed -i -E 's/^\s*(bind-address\s+=.*)/#\1/' my.cnf 

它仍然可以簡化爲

sed -i -E 's/^\s*(bind-address\s+=)/#\1/' my.cnf 
+1

甚至只是'sed -i'/^\ s * bind-address \ s * =/s/^ /#/'my.cnf'。我相信所有這些都是GNU特有的(或者至少是非POSIX),因爲'[[:space:]]'使用'\ s'縮寫。 –

+0

是''s''是GNU特有的,沒有提及OP是使用它的......在你的版本中有細微的差別,它不會刪除行開頭的可選空格,我想OP可能想要那個和因此將它留下...... – Sundeep

1

嘗試用更短,更容易sed命令,就像...

sed -i -e 's/bind-address/\#bind-address/g' my.cnf

你沒有使用正則表達式和其他人,因爲綁定地址是在my.cnf中只使用一次,沒有其他行以此開始等等,這個有點骯髒或懶惰的方法是一個工作。

+0

沒有理由逃避'#',它不是一個元字符。 –

0

@ Sundeep的回答非常明確和可以理解。只是作爲補充。一個解決可能是

sed -i 's/^\s*\(bind-address\s\{1,\}=.*\)/#\1/' my.cnf 

+可以通過\{1,\}

0

您還可以使用空間/製表符字符類(和反向引用,以避免重複)被模仿:

sed -i 's/^\([[:space:]]*\)bind-address\1*/#&/' file