【问题标题】:sed line range, all but the last linesed 行范围,除了最后一行
【发布时间】:2010-10-31 03:36:08
【问题描述】:

您可以指定要操作的行范围。比如对所有行进行操作,(当然是默认的):

sed -e "1,$ s/a/b/"

但我需要对除最后一行之外的所有内容进行操作。你显然不能使用算术表达式:

sed -e "1,$-1 s/a/b/"

(在这种情况下,我使用的是 cygwin,如果有影响的话)

【问题讨论】:

    标签: sed


    【解决方案1】:
    sed -e "$ ! s/a/b/"
    

    这将匹配除最后一行之外的每一行。通过快速测试确认!

    【讨论】:

    • 解释这里发生了什么:$ 选择最后一行。 ! 然后否定该行范围,选择每一行除了最后一行。然后在结果行范围内执行搜索替换。
    • 如果行块中有空行,这对我有用
    【解决方案2】:

    这个命令也有效

    sed '$d'
    

    【讨论】:

    • 如果他想把最后一行打印出来怎么办?
    【解决方案3】:

    我知道不是@​​987654321@,但我觉得head得到了最简单最灵活的方式:

    head -n -1 the-file
    

    使用-2、-3...而不是-1,检索除最后两行以外的所有行,等等。

    【讨论】:

    • 这是我通常做的,但head(1)在mac上不能处理否定参数
    • 部分 MacOS shell 不支持“-1”
    【解决方案4】:

    嗯,你可以用这样的东西破解它:

    sed -e "1,$(($(cat the-file | wc -l) - 1))s/a/b/"
    

    或者,您可以改用tail

    (tail +1 the-file) | sed -e s/a/b/; tail -1 the-file
    

    【讨论】:

      【解决方案5】:

      在更一般的意义上,这个问题需要您通过指定一个范围来编辑流,其中一个范围限制是与文件结尾的偏移量。以下示例显示了如何执行此操作。在这个例子中,我打印出文件的所有行,从最后一行的第 5 行开始,到最后一行结束。在您的情况下,您可以设置OFFSET = -1而不是OFFSET = -5

      (( OFFSET = -5 )); (( N1 = $(cat pgen.c | wc -l) + OFFSET )); sed -n "$N1,\$p" thefile
      

      此命令可以在一行中输入。

      【讨论】:

      • 亚历杭德罗,这个答案应该被删除,介绍性文字移到你的替代答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 2012-10-14
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多