2017-07-29 29 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