gpt4 book ai didi

sed - 使用 sed 删除文件的行 - 意外行为

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:00 25 4
gpt4 key购买 nike

我在使用 sed 时发现有些奇怪。如果您尝试从文件中删除多行间隔(按编号),但列表中后面指定的任何间隔都完全包含在列表前面的间隔内,则在指定的(较大的)间隔之后删除一个额外的单行。

seq 10 > foo.txt

sed '2,7d;3,6d' foo.txt
1
9
10

这种行为是我讨厌的错误背后的原因,因为在我的脚本中我动态生成了区间端点,并且在某些情况下生成的区间是多余的。我可以清理它,但我想不出 sed 故意这样做的充分理由。

最佳答案

由于这个问题在 2015 年 2 月 24 日的 Stack Overflow 每周通讯电子邮件中被突出显示为需要答案,所以我将上面的评论(提供答案)转换为正式答案。此处未注明出处的评论是我以基本相同的形式发表的。

感谢您提出简洁、完整的问题。结果很有趣。我可以用你的脚本重现它。有趣的是,sed '3,6d;2,7d' foo.txt(删除操作的顺序相反)产生了预期的答案,输出中包含 8。这使得它看起来像是 (GNU) sed 中的一个可报告错误,尤其是当 BSD sed(在 Mac OS X 10.10.2 Yosemite 上)与操作正常工作时以任何顺序。我使用来自 Ubuntu 14.04 衍生版本的“sed (GNU sed) 4.2.2”进行了测试。

为您/他们提供更多数据点。这两个都在输出中包含 8:

sed -e '/2/,/7/d' -e '/3/,/6/d' foo.txt
sed -e '2,7d' -e '/3/,/6/d' foo.txt

相比之下,这不会:

sed -e '/2/,/7/d' -e '3,6d' foo.txt

后者让我感到惊讶(甚至接受了基本错误)。

Beats me. I thought given some of sed's arcane constructs that you might be missing the batman symbol or something from the middle of your command but sed -e '2,7d' -e '3,6d' foo.txt behaves the same way and swapping the order produces the expected results (GNU sed 4.2.2 on Cygwin). /bin/sed on Solaris always produces the expected result and interestingly so does GNU sed 3.02. Ed Morton

More data: it only seems to happen with sed 4.2.2 if the 2nd range is a subset of the first: sed '2,5d;2,5d' shows the bug, sed '2,5d;1,5d' and sed '2,5d;2,6d' do not. glenn jackman

GNU sed主页上写着“请将错误报告发送到 gnu.org 上的 bug-sed”(除了它用 @ 代替 'at')。你有一个很好的复制品;明确你期望的输出与你得到的输出(他们会明白重点,但最好确保他们不会误解)。指出命令的逆序按预期工作,并给出各种其他命令作为工作或不工作的示例。 (您甚至可以将此问答 URL 作为交叉引用,但请确保错误报告是独立的,以便即使没有人访问该 URL 也能理解它。)

您还可以指向 BSD sed(以及 Solaris 版本和较旧的 GNU 3.02 sed),其行为符合预期。在旧版本 GNU sed 工作的情况下,这意味着这可以说是一种倒退。 [...经过一些实验...] 4.1 版本出现了问题; 4.0.9 版本没问题。 (我还检查了 4.1.5 和 4.2.1;两者都损坏了。)如果维护人员想通过查看更改的内容来查找问题,这将有助于维护人员。

OP 指出:

  • Thanks everyone for comments and additional tests. I'll submit a bug report to GNU sed and post their response. santayana

关于sed - 使用 sed 删除文件的行 - 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43822484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com