問題發表評論的一行:在my.cnf文件有一條線,看起來像這樣:不能在my.cnf
...
bind-address = 127.0.0.1
...
,必須註釋掉。我試圖用這個sed:
sed -i 's/^[\s\t]*\(bind-address[\s\t]+=.*\)/#$1/g' my.cnf
但由於某種原因它不起作用。
問題發表評論的一行:在my.cnf文件有一條線,看起來像這樣:不能在my.cnf
...
bind-address = 127.0.0.1
...
,必須註釋掉。我試圖用這個sed:
sed -i 's/^[\s\t]*\(bind-address[\s\t]+=.*\)/#$1/g' my.cnf
但由於某種原因它不起作用。
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
嘗試用更短,更容易sed命令,就像...
sed -i -e 's/bind-address/\#bind-address/g' my.cnf
你沒有使用正則表達式和其他人,因爲綁定地址是在my.cnf中只使用一次,沒有其他行以此開始等等,這個有點骯髒或懶惰的方法是一個工作。
沒有理由逃避'#',它不是一個元字符。 –
@ Sundeep的回答非常明確和可以理解。只是作爲補充。一個解決可能是
sed -i 's/^\s*\(bind-address\s\{1,\}=.*\)/#\1/' my.cnf
+
可以通過\{1,\}
您還可以使用空間/製表符字符類(和反向引用,以避免重複)被模仿:
sed -i 's/^\([[:space:]]*\)bind-address\1*/#&/' file
甚至只是'sed -i'/^\ s * bind-address \ s * =/s/^ /#/'my.cnf'。我相信所有這些都是GNU特有的(或者至少是非POSIX),因爲'[[:space:]]'使用'\ s'縮寫。 –
是''s''是GNU特有的,沒有提及OP是使用它的......在你的版本中有細微的差別,它不會刪除行開頭的可選空格,我想OP可能想要那個和因此將它留下...... – Sundeep