sed替换命令无法在Mac上运行

时间:2014-08-04 18:13:33

标签: regex macos bash sed

我尝试使用sed将bak变量的值替换为CMakelists.txt文件中的某些文本,但我收到错误:

sed: 1: "'s/iPhone": invalid command code ?

sed命令:

sed -i "" 's/iPhone Developer/'$PROVPROF'/g' CMakelists.txt

PROVPROF总会有这种格式的东西:

iPhone Developer: Firstname Lastname (Numbers/Letters)

3 个答案:

答案 0 :(得分:6)

如果变量中的字符与用于s的分隔符相同,请尝试使用其他分隔符:

sed -i '' "s|iPhone Developer|$PROVPROF|g" CMakelists.txt

更罕见的事情:

sed -i '' $'s\xFFiPhone Developer\xFF'"$PROVPROF"$'\xFFg' CMakelists.txt

更新

另外,请勿尝试将参数存储在变量中。分词并不总是像你一样。这是错的:

command="sed -i '' 's|iPhone Developer|$PROVPROF|g' CMakelists.txt"
$command

会出现sed: -e expression #1, char 1: unknown command: `''之类的错误消息。在其他sed上,消息可能不同。

但你可以使用数组:

command=(sed -i '' "s|iPhone Developer|$PROVPROF|g" CMakelists.txt)
"${command[@]}"
但是,它仍然不值得称道。如果您可以直接运行它,请直接运行它。

答案 1 :(得分:1)

这不起作用的原因是因为linux上的sed与mac上的sed不同。为了使命令按预期工作,我建议通过自制软件安装gnu-sed。

您可以通过以下方式执行此操作:brew install gnu-sed --with-default-names

注意:--with-default-names标志会尝试用你的sed符号链接gnu-sed,应该是你想要的,但如果没有,我警告你!

然后在bash上运行hash -r,或在zsh上运行rehash

如果之后不起作用,则必须通过以下方式手动用gdu-sed与sed进行符号链接:

ln -s /usr/local/bin/gsed $(which sed)

答案 2 :(得分:0)

file.txt包含:

Angelina used to like iPhone Developers.
Now she's more of an Android Developer fan-girl.

和Bash脚本一样:

#!/bin/bash
#
#
export MONKEY_1="Billy Bob";
export MONKEY_2="Brad Pitt";

sed -e "s/iPhone Developer/$MONKEY_1/g" -e "s/Android Developer/$MONKEY_2/g" file.txt

运行它会产生:

Angelina used to like Billy Bobs.
Now she's more of an Brad Pitt fan-girl.