跳到主要内容

Mac 上一些命令行的兼容使用

提示

对于熟练 Linux 命令行的用户来说,MacOS 上的一些命令行指令用法可能会有一些差异

xargs

xargs 命令的格式如下

$ xargs [-options] [command]

Mac 上,使用 -I {} 选项来指定替换字符串,而在 Linux 上,使用 -i 选项来指定替换字符串

  • 举例

Linux 下的命令

find ./target/generated-sources/ -name "*.java" | xargs  -n1 -i cp {} ./src/main/java/com/grpc/mistra/generate/

Mac 下的等价命令为

find ./target/generated-sources/ -name "*.java" | xargs  -n1 -I {} cp {} ./src/main/java/com/grpc/mistra/generate/
# 或者,大写 F 代替 {}
find ./target/generated-sources/ -name "*.java" | xargs -n1 -I F cp "F" ./src/main/java/com/grpc/mistra/generate/

使用xargs有个常用的场景:批量执行,例如下面批量查询域名的解析结果

cat domains.txt | xargs -I {} sh -c 'echo {}; dig {}'

sed

sed 命令的格式如下

$ sed [options] [expression] [file]

MacLinux 上,-i参数用于表示原地编辑文件(in-place),但两者的用法有所不同

  • 举例

Linux(GNU sed):

sed -i 's/old/new/g' file.txt

macOS(BSD sed):必须提供备份扩展名参数(可为空字符串):

sed -i '' 's/old/new/g' file.txt   # 不生成备份
sed -i .bak 's/old/new/g' file.txt # 生成 file.txt.bak 备份

兼容建议:安装 GNU sed 并以 gsed 使用,使行为与 Linux 一致:

brew install gnu-sed

如需无感替换,可在 ~/.bash_profile~/.zshrc 中设置:

alias sed='gsed'

补充说明:

  • gsedGNU sed 的可执行名
  • GNUBSD sed-i 行为差异源于二者的非 POSIX 扩展实现,-i 参数在 GNU 解析为紧随选项的备份后缀,而在 BSD 解析为下一位置参数的备份后缀
  • 若需跨平台无差异原地替换,也可使用 PerlPerl 命令是指通过命令行界面运行的 Perl 脚本或命令,最常见的是使用 perl 解释器执行代码,例如 perl -e '...' 来运行单行命令,或 perl script.pl 来执行脚本文件
perl -pi -e 's/foo/bar/' example.txt