【发布时间】:2022-01-02 17:26:14
【问题描述】:
我正在尝试修改来自 https://stackoverflow.com/a/66365284/1236401 的答案,该答案添加了控制流以提供匹配状态代码:
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": 未定义标签 'x;q1;:x'
我在 OSX 上找到的所有对sed 行为不端的引用都是针对就地文件编辑的,这里不是这种情况。
【问题讨论】:
-
该问题已得到解答,但仅供参考,来自 POSIX 手册页:
Command verbs other than {, a, b, c, i, r, t, w, :, and # can be followed by a <semicolon>, optional <blank> characters, and another command verb.。对于这些命令,您可以使用新行,或使用-e(也是 POSIX)分成块。 “未定义标签”是 BSD sed 在标签中接受;,而在 GNU 中,命令分隔符的含义优先(这是与标准的偏差)。 -
sed 是一个很好的工具,可以在单独的行上进行简单的 s/old/new/ 替换,但是如果您有任何其他文本操作来执行代码,那么它将是更清晰、更健壮的组合,如果您使用 awk,则更便携、更高效。如果@triplee 的答案是否与 awk 等效,我知道 sed 咒语做了什么——如果不是,并且您添加简洁、可测试的样本输入和预期输出以及
awk标签,我们可以为您提供帮助。 -
这可以写成
sed '/1/{s//replaced-it/;q1}' file或sed '/1/!b;s//replace-it/;q1' file。