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

Ott*_*o45 2 regex macos bash sed

我正在尝试使用sed替换CMakelists.txt文件中的一些文本和bash变量的值,但是我收到一个错误:

sed: 1: "'s/iPhone": invalid command code ?
Run Code Online (Sandbox Code Playgroud)

sed命令:

sed -i "" 's/iPhone Developer/'$PROVPROF'/g' CMakelists.txt
Run Code Online (Sandbox Code Playgroud)

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

iPhone Developer: Firstname Lastname (Numbers/Letters)
Run Code Online (Sandbox Code Playgroud)

小智 8

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

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

注意:--with-default-namesflag 会尝试将 gnu-sed 与您的 sed 进行符号链接,这应该是您想要的,但如果不是,我警告过您!

然后hash -r在 bash 或rehashzsh 上运行。

如果之后它不起作用,您必须通过以下方式手动符号链接 gnu-sed 和 sed:

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

  • brew 无法处理(不再)--with-default-names 你可以运行brew install gnu-sed (2认同)

kon*_*box 6

如果变量中的字符与您以前使用的分隔符相同s,请尝试使用另一个分隔符:

sed -i '' "s|iPhone Developer|$PROVPROF|g" CMakelists.txt
Run Code Online (Sandbox Code Playgroud)

更罕见的东西:

sed -i '' $'s\xFFiPhone Developer\xFF'"$PROVPROF"$'\xFFg' CMakelists.txt
Run Code Online (Sandbox Code Playgroud)

更新:

另外,不要试图将参数存储在变量上.分词并不总是像你一样.这是错的:

command="sed -i '' 's|iPhone Developer|$PROVPROF|g' CMakelists.txt"
$command
Run Code Online (Sandbox Code Playgroud)

sed: -e expression #1, char 1: unknown command: `''会出现错误信息.在其他方面sed,消息可能不同.

但是你可以使用一个数组:

command=(sed -i '' "s|iPhone Developer|$PROVPROF|g" CMakelists.txt)
"${command[@]}"
Run Code Online (Sandbox Code Playgroud)

尽管如此,它仍然不值得称道.如果您可以直接运行它,请直接运行它.

  • 我认为对于 OSX,您可能需要“-i”上的空引号。[检查链接的问题](http://stackoverflow.com/questions/4247068/sed-command-failing-on-mac-but-works-on-linux?lq=1)。并检查问题的注释,“/”实际上不在变量中 (3认同)