我一直在使用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'
我试过'\''来逃避单引号,我认为太阳下的其他所有东西都不能在那里得到它。
任何人都可以指出我可能出现的明显错误吗?
谢谢。
答案 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'
最有可能只在一行上。
或者你可以逃避一切。