sed 分支不适用于 OSX:未定义的标签

sed branching not working on OSX: undefined label

我正在尝试调整来自 的答案,该答案添加了控制流以提供匹配状态代码:

cat file.txt | sed 's/1/replaced-it/;tx;q1;:x'

它在 Ubuntu 和 Alpine 上按预期工作,但在 Mac OSX (11.6) 上失败,使用任何 shell.

sed: 1: "s/1/replaced-it/;tx;q1;:x": undefined label 'x;q1;:x'

我能找到的所有关于 sed 在 OSX 上行为不当的参考文献都是针对就地文件编辑的,这里不是这种情况。

sed 中的命令主要由换行符分隔。

| sed 's/1/replaced-it/
  tx
  q1
  :x
'

或者:

sed -e 's/1/replaced-it/' -e 'tx' -e 'q1' -e ':x'

此外,q1 是一个 GNU sed 扩展——并非每个 sed 都支持它。它必须被删除、重构,或者您必须安装 GNU sed.

总的来说,用awk、python或perl来写。

这是一个 Awk 重构。

awk '/1/ { sub("1", "replaced-it", [=10=]); replaced=1 } 1
    END { exit 1-replaced }' file.txt

还要注意 the cat is useless(还有 sed,通常是任何标准的 Unix 命令,除了烦人的 tr)。

AWK 等价物是:

awk '!sub(/1/,"replaced-it") {print; exit 1} 1' file.txt

如果替换不成功:打印并以状态1退出;否则打印。