我用sed
macOS 上的命令包含以下文本:
$ cat pets.txt
This is my cat
my cat's name is betty
This is your dog
your dog's name is frank
This is your fish
your fish's name is george
This is my goat
my goat's name is adam
当我运行 BSD 时sed
它显示一个错误:
$ sed '/dog/,+3s/^/# /g' pets.txt
sed: 1: "/dog/,+3s/^/# /g": 预期的上下文地址
它出什么问题了?当我使用gsed
(GNU sed),它运行良好:
This is my cat
my cat's name is betty
# This is your dog
# your dog's name is frank
# This is your fish
# your fish's name is george
This is my goat
my goat's name is adam
它可以与 GNU sed 一起使用,因为您正在利用 GNU 项目添加到 sed 的功能,该功能以前在程序中不存在(并且在非 GNU 版本中仍然不存在)。
您可以通过以下方式在非 GNU sed 中获得相同的结果:
sed -E '/dog/{N;N;N;s/(^|\n)/&# /g;}' pets.txt
也就是说,一旦我们看到“dog”,也拉入接下来的三行。然后贴一个#
+ 行首后的空格 (^
) 和所有换行符 (\n
)。为了能够在单个正则表达式中进行搜索和替换,我们需要启用扩展正则表达式,这就是-E
做。没有它,我们可以用两个来完成s
命令,一个用于行首,一个用于换行:
sed '/dog/{N;N;N;s/^/# /;s/\n/&# /g;}' pets.txt
如果您正在寻找另一种方法在普通 Mac 上执行此操作而不安装 GNU coreutils,您可能需要使用不同的实用程序,例如 awk:
awk '/dog/ {l=3}; (l-- > 0) {$0="# "$0} 1' pets.txt
或 perl (与 awk 版本相同的想法,只是语法不同):
perl -pe '$l=3 if /dog/; s/^/# / if $l-- > 0;' pets.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)