我有一个Bash脚本替换PHP常量,例如define('xxxx',....);
与期望的一个。
由:
sudo sed -E -i "" "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file"
问题是在Ubuntu上由于 i 之后的额外空间而失败。
-i ""
如果删除该空格,它将在Ubuntu上运行但不适用于MacOS,例如给出错误。
sed: 1: "../config.php ...": invalid command code
我可以选择在* nix上安静地使用此命令吗?
提前感谢您的时间和知识。
答案 0 :(得分:2)
sudo perl -pi -e "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file"
我怀疑你的意思是['\"]
。
答案 1 :(得分:1)
-i选项是GNU方言的一部分。这不便携。
另一种方法是使用临时中间文件:
sed ... ${file} > ${file}.tmp && mv ${file}.tmp ${file}
另一个是使用perl而不是sed,as suggested by triplee。
答案 2 :(得分:1)
为了就地执行操作并抑制或避免创建备份文件,您可以在操作系统上设置数组条件。
[[ $(uname -s) == 'Darwin' ]] && ioption=(-i "") || ioption=(-i)
sed "${ioption[@]}" "s/^(define).*(${2})['\"].*/${3}/g" "$file"
使用数组,以便引用的参数和多个选项/参数都可以工作。如果您想要使其他条件有条件,您可以向数组中添加更多内容。
请注意,管道不是括号表达式中的替换字符 - 而是字面上包含它。因此,除非您想要匹配管道,否则应该省略它。在外部双引号内,单引号不需要转义。
答案 3 :(得分:0)
在OS X上安装GNU sed并使用它。