sed单引号

时间:2011-12-14 19:48:12

标签: bash sed escaping

我一直在使用SED(Bash shell)来逃避单引号的问题。

我需要制作

$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'

我试过'\''来逃避单引号,我认为太阳下的其他所有东西都不能在那里得到它。

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

谢谢。

3 个答案:

答案 0 :(得分: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是如何工作的。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

试试这个:

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

匹配包含“anything..Servers..anything..password..anything ..'”的行(以''结束)并在该行上将''替换为{{1} }}

这可以匹配多行,但只会更改第一个出现。 测试一下,'foo'最有可能只在一行上。

或者你可以逃避一切。