逃避UNIX角色

时间:2013-08-26 11:08:09

标签: shell unix replace sed escaping

这应该很容易,但我无法摆脱它:

我需要使用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的新手,我不知道要逃避什么......

应该改变什么?谢谢!

2 个答案:

答案 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