sed 使用:预期上下文地址

2024-01-20

我用sedmacOS 上的命令包含以下文本:

$ 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(使用前将#替换为@)

sed 使用:预期上下文地址 的相关文章

随机推荐