Yar*_*rin 271 linux macos bash sed
我已成功使用以下sed命令在Linux中搜索/替换文本:
sed -i 's/old_link/new_link/g' *
Run Code Online (Sandbox Code Playgroud)
但是,当我在Mac OS X上试用它时,我得到:
"命令c期望\后跟文本"
我以为我的Mac运行普通的BASH shell.这是怎么回事?
编辑:
根据@High Performance,这是由于Mac sed具有不同的(BSD)风格,因此我的问题是如何在BSD中复制此命令sed?
编辑:
以下是导致此问题的实际示例:
sed -i 's/hello/gbye/g' *
Run Code Online (Sandbox Code Playgroud)
Sin*_*ris 356
如果使用-i选项,则需要为备份提供扩展.
如果你有:
File1.txt
File2.cfg
Run Code Online (Sandbox Code Playgroud)
命令(注意和之间缺少空间-i以及使其适用于新版本的Mac和GNU):-i''
sed -i'.original' -e 's/old_link/new_link/g' *
Run Code Online (Sandbox Code Playgroud)
创建2个备份文件,如:
File1.txt.original
File2.cfg.original
Run Code Online (Sandbox Code Playgroud)
没有可移植的方法来避免制作备份文件,因为无法找到适用于所有情况的混合sed命令:
-e- 因为它创建sed -i -e ...备份而无法在OS X上运行-e - 不适用于OS X 10.6,但适用于10.9+sed -i'' -e ... - 没有在GNU上工作注意鉴于没有sed命令在所有平台上运行,您可以尝试使用另一个命令来实现相同的结果
例如 sed -i '' -e ...
Pau*_*ce. 57
当你使用-i时,我相信OS X 需要一个扩展备份文件.尝试:
sed -i .bak 's/hello/gbye/g' *
Run Code Online (Sandbox Code Playgroud)
使用GNU sed,扩展是可选的.
chi*_*iik 53
这适用于sed的GNU和BSD版本:
sed -i'' -e 's/old_link/new_link/g' *
Run Code Online (Sandbox Code Playgroud)
或备份:
sed -i'.bak' -e 's/old_link/new_link/g' *
Run Code Online (Sandbox Code Playgroud)
注意-i选项后缺少空格!(GNU sed必备)
Sru*_*tur 30
在Mac中遇到同样的问题并解决了它brew:
brew install gnu-sed
Run Code Online (Sandbox Code Playgroud)
并用作
gsed SED_COMMAND
Run Code Online (Sandbox Code Playgroud)
您可以设置为sed别名gsed(如果需要):
alias sed=gsed
Run Code Online (Sandbox Code Playgroud)
Oha*_*ick 20
或者,您可以在Mac中安装GNU版本的sed,名为gsed,并使用标准Linux语法进行使用.
为此,请运行gsed使用端口(如果没有端口,请通过http://www.macports.org/获取)sudo port install gsed.然后,你可以运行sed -i 's/old_link/new_link/g' *
你的Mac确实运行了一个BASH shell,但这更像是你正在处理的sed实现的问题.在Mac上,sed来自BSD,与您在典型Linux机器上可能找到的sed略有不同.我建议你man sed.
Sinetris的答案是正确的,但我使用find命令来更具体地说明我想要更改的文件.一般来说这应该工作(在osx上测试/bin/bash):
find . -name "*.smth" -exec sed -i '' 's/text1/text2/g' {} \;
Run Code Online (Sandbox Code Playgroud)
通常,在sed没有find复杂项目的情况下使用效率较低.
我创建了一个函数来处理sedMacOS(在 MacOS 10.12 上测试)和其他操作系统之间的差异:
OS=`uname`
# $(replace_in_file pattern file)
function replace_in_file() {
if [ "$OS" = 'Darwin' ]; then
# for MacOS
sed -i '' -e "$1" "$2"
else
# for Linux and Windows
sed -i'' -e "$1" "$2"
fi
}
Run Code Online (Sandbox Code Playgroud)
用法:
$(replace_in_file 's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"',' "./mysql/.env")
Run Code Online (Sandbox Code Playgroud)
在哪里:
,是一个分隔符
's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"','是模式
"./mysql/.env"是文件的路径
sed除了调用 sed with ,我做./bin/sed
这是我的包装脚本 ~/project/bin/sed
#!/bin/bash
if [[ "$OSTYPE" == "darwin"* ]]; then
exec "gsed" "$@"
else
exec "sed" "$@"
fi
Run Code Online (Sandbox Code Playgroud)
不要忘记chmod 755包装脚本。