sed - 跨平台兼容的 sed 命令?
问题描述
我正在尝试使用sed
,但我想在 Linux 和 Mac 下都能正常运行。目前,我有这样的事情:
if test -f ${GENESISFILE};
then
echo "Replacing ..."
sed -i '' "s/ADDRESS/${ADDRESS}/g" ${GENESISFILE}
else
echo "No such file"
fi
现在,关键是使用-i ''
部分它在 Mac 下可以正常运行,但在 Linux 下不能,如果我删除它,它在 Mac 下就不能工作。使它跨平台兼容的正确方法是什么?
解决方案
而不是sed
单线:
sed -i '' "s/ADDRESS/${ADDRESS}/g" ${GENESISFILE}
使用这个跨平台的 Perl one-liner,它在 Linux 和 macOS 上都可以正常运行:
perl -i.bak -pe 's/ADDRESS/$ENV{ADDRESS}/g' ${GENESISFILE}
Perl 单行器使用这些命令行标志:
-e
:告诉 Perl 查找内联代码,而不是在文件中。
-p
:一次循环输入一行,$_
默认情况下将其分配给。print $_
在每次循环迭代后添加。
-i.bak
:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过在其名称后附加扩展名来保存原始文件的备份副本.bak
。-i
单独使用,不使用.bak
,跳过制作备份。
推荐阅读
- powerbi - 使用本地 SSAS 作为数据集的服务主体嵌入 powerbi 报告
- react-native - 如何使用 react-native 获取 SQLite 数据库文件路径以获取数据库
- selenium - 为什么 Windows 中的多个并行 webdriver 实例共享一个 chrome 窗口,而在 Linux 中却没有?
- jquery - Rails - 在ajax之后使用部分更新引导弹出内容
- google-maps - 如何限制谷歌地图大小缩放不小于屏幕宽度/高度
- http - 误用的标头名称。... 带有 HttpResponseMessage 的响应标头,以及带有 HttpContent 对象的内容标头
- sql - 我应该为同一列中的字母和数字使用什么数据类型?
- elasticsearch - Elasticsearch Opendistro ISM:可以采取什么方法自动将翻转别名和策略应用于新索引?
- javascript - 从服务器(API?)获取数据并将其显示在 HTML 页面上
- python - 基于字符频率的字符串搜索