【问题标题】:Delete the first line that matches a pattern删除与模式匹配的第一行
【发布时间】:2014-07-27 12:11:35
【问题描述】:

如何使用 sed 仅删除包含特定模式的第一行?

例如,我想从该文档中删除匹配FAA 的第一行:

1. foo bar quuz
2. foo FAA bar (this should go)
3. quuz quuz FAA (this should remain)
4. quuz FAA bar (this should also remain)

结果应该是

1. foo bar quuz
3. quuz quuz FAA (this should remain)
4. quuz FAA bar (this should also remain)

非常感谢 POSIX sed 的解决方案,GNU sed 可以。

【问题讨论】:

    标签: sed


    【解决方案1】:

    使用GNU sed,您可以使用以下成语:

    sed '0,/FAA/{/FAA/d}' input.txt
    

    它将删除操作应用于从文件开头到第一次出现FAA 的范围,并仅删除该行。

    【讨论】:

    • 0 不符合 posix 标准(不适用于我的 AIX),但可用时最好的操作线
    • @NeronLeVelu GNU sed is OK
    • @NeronLeVelu 感谢您的提示。我稍后会检查这个。需要快点去看牙医... :) thx (et)Kent
    • 为什么你使用0而不是1
    • 如果FAA 出现在第一行,则使用 1 代替 0 不会产生正确的结果。
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -n '/FAA/{:a;n;p;ba};p' file
    

    打印所有行直到遇到FAA,然后跳过该行并将所有后续行打印到文件末尾。

    【讨论】:

    • 还是很干净很短,喜欢你的风格
    【解决方案3】:
    sed '1 {/FAA/ d;};1,/FAA/ {/FAA/d;}' YourFile
    

    FAA 在第一行的情况需要特殊测试(或者它需要第一次出现和下一次出现)

    另一种选择

    sed '/FAA/ !b
       N;s/.*\n//
    :end
       N
       $ p
       b end' YourFile
    

    【讨论】:

    • 有趣,我在评论@hek2mgl 的答案后看到了这个答案。 sed 有 0 个地址。可能更容易解决这个问题。
    • 我认为在特殊情况下,您的1{...} 部分,您需要以某种方式执行next。否则,如果 #1 和 #2 行都有FAA,则这两行都将被删除。
    • @Kent 是对的,试试printf "1. a FAA\n2. b FAA\n3. cc dd\n" | sed -e '1 {/FAA/ d;};1,/FAA/ {/FAA/d;}'。仅显示第 3 行。
    • 奇怪,我在我的 aix 上尝试打印和回显,并且都像预期的那样占用第二行而不是第一行。所以在 AIX 上,sed 不会在第 1 行之后进入第二部分(如果 /FAA/ occr 在第 1 行),但其他系统在第 1 行之后进入循环。您可以尝试使用 --posix(在 GNU sed 上)吗?跨度>
    【解决方案4】:

    使用awk,这很容易做到:

    awk '!f && /FAA/ {f=1;next}1' file
    1. foo bar quuz
    3. quuz quuz FAA (this should remain)
    4. quuz FAA bar (this should also remain)
    

    【讨论】:

      【解决方案5】:

      使用 GNU sed

      sed '0,/FAA/{//d}' file
      

      详细信息 => 信息 sed

      【讨论】:

      • 有趣的是sed '1,/.../{//d}' file 产生了一个错误!我也相信这只适用于 GNU sed。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多