2011-12-14 91 views
4

我一直在使用SED(Bash shell)转义转义单引号的问题。sed单引号

我需要

$cfg['Servers'][$i]['password'] = ''; 

$cfg['Servers'][$i]['password'] = 'mypassword'; 

我已经试过是:

sed -i "s/$cfg['Servers'][$i]['password'] = '';/$cfg['Servers'][$i]['password'] = '$rootpassword';/g" /usr/share/phpmyadmin/libraries/config.default.bak 

这最终真正混杂行。

$cfg['Servers'][$i]['password['Servers'][]['passsword'] = 'mypassword' 

我试过'\''来逃避单引号,我认为一切都在阳光下,但不能在那里得到它。

任何人都可以指出我可能的明显错误吗?

谢谢。

+0

这是唯一带有````的行吗?如果是这样,就匹配。另外,为extended-regex添加`-r`标志。这将解决很多问题。 – 2011-12-14 19:50:55

+0

请注意其他文字 - '$`,`[`,`]` – 2011-12-14 19:53:58

回答

4
$ sed -i "s/\$cfg\['Servers'\]\[\$i\]\['password'\] = '';/\$cfg['Servers'][\$i]['password'] = '\$rootpassword';/g" file 
+0

这工作 - 只需要添加一个额外的\ infront $ rootpassword。 我想我需要阅读更多关于转义。我想我越来越为了某些事物逃脱了。即为什么`[\ $ i]`在另一个地方比'`[\ $ i']``。 – Chasester 2011-12-14 22:31:09

1

试试这个:

sed -i "/Servers.*password.*''$/s/''/'foo'/" /path/to/your/testfile 

匹配的是包含一条线 “anything..Servers..anything..password..anything .. ''”(与''结束),并在该行替换为'''foo'

这可以匹配多行,但只有第一个的发生将会改变。 测试一下,很有可能.. Servers .. password .. ''只在一行上。

或者你可以逃避一切。

+0

有趣,看起来像匹配两行,Servers .. password和Servers .. nopassword。 但是 - 我需要的是第一个例子。 – Chasester 2011-12-14 21:37:33

13

而不是转义,您可以使用\x27单引号。这不仅适用于sed,awk等。

看到测试:

kent$ cat tt 
$cfg['Servers'][$i]['password'] = '' 

kent$ sed -r 's/(\$cfg\[\x27Servers\x27\]\[\$i\]\[\x27password\x27\] \= \x27)\x27/\1mypassword\x27/g' tt 
$cfg['Servers'][$i]['password'] = 'mypassword' 

注意到,sed的行可能不是你的问题的最佳解决方案,例如将整个字符串放到“s /../”可能不是必需的。不过,我只想说明\ x27的工作方式。