问题发表评论的一行:在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