这应该很容易,但我无法摆脱它:
我需要使用unix命令行替换.php文件中的一段文本。
使用:sudo sed -i '' 's/STRING/REPLACEMENT/g' /file.php
(需要-i之后的引号,因为它在Mac Os X上运行)
字符串:['password'] = "";
需要替换为:['password'] = "$PASS";
$ PASS是一个变量,因此它被填充。
我做了类似的事情:
sudo sed -i '' 's/[\'password\'] = ""\;/[\'password\'] = "$PASS"\;/g' /file.php
但是,由于我是UNIX的新手,我不知道要逃避什么......
应该改变什么?谢谢!
答案 0 :(得分:1)
不幸的是,sed无法稳健地处理可能包含对sed和shell“特殊”的各种字符的变量。您需要使用awk,例如使用GNU awk for gensub():
gawk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
当PASS包含正斜杠但awk不关心时,请参阅下面的sed如何失败:
$ cat file
The string: ['password'] = ""; needs to be replaced
$ PASS='foo'
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
The string: ['password'] = "foo"; needs to be replaced
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file
The string: ['password'] = "foo"; needs to be replaced
$ PASS='foo/bar'
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
The string: ['password'] = "foo/bar"; needs to be replaced
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file
sed: -e expression #1, char 38: unknown option to `s'
您需要使用\047
或其他一些方法(例如'"'"'
,如果您愿意)来表示单引号分隔的awk脚本中的单引号。
在没有gensub()的awks中你只需使用gsub():
awk -v pass="$PASS" '{pre="\\[\047password\047] = \""; gsub(pre,pre pass)}1' file
答案 1 :(得分:0)
如果你想在sed中扩展变量,你必须使用双引号,所以像
sed -i... "s/.../.../g" file
也就是说,您不必转义那些单引号,也可以使用组引用来保存一些输入。你可以尝试:
sudo sed -i '' "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" /file.php