0

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

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

应该改变什么?谢谢!

4

2 回答 2

1

不幸的是,sed 无法稳健地处理可能包含对 sed 和 shell 来说“特殊”的各种字符的变量。为此,您需要使用 awk,例如使用 GNU awk 进行 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
于 2013-08-26T12:30:02.843 回答
0

如果你想在 sed 中扩展变量,你必须使用双引号,所以像

sed -i... "s/.../.../g" file

也就是说,您不必转义那些单引号,也可以使用组引用来节省一些输入。你可以试试:

sudo sed -i '' "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" /file.php
于 2013-08-26T11:14:57.287 回答