【问题标题】:SED command to delete empty lines till the first occurrence of sentenceSED 命令删除空行直到第一次出现句子
【发布时间】:2013-11-15 01:32:12
【问题描述】:

我的输入文件将是

[emptyline]
[emptyline]
aaa
bbb
[emptyline]
cc
dd

这里的[emptyline]表示空白行。

我需要一个 SED 命令将其更改为

aaa
bbb
[emptyline]
cc
dd

也就是说,我需要单独删除顶部的所有空行。

我只需要 SED 命令,因为我需要在 bash 脚本中使用它。

MAC OSx 的附加信息

【问题讨论】:

  • 需要其他信息:到目前为止您尝试了什么?
  • 我找不到这种情况的解决方案..我正在使用 sed 删除文件中的所有第一行,当时在我的第一行创建此问题后的空行...

标签: regex macos bash sed


【解决方案1】:

您可以通过 sed 中的分支来做到这一点:

sed '/^ *$/d; :a; n; ba' file

更有效的解决方案是使用范围表达式,请参阅user2719058's answer 了解如何执行此操作。

如果您可以减少对 sed 的需求,效率会更高,请参阅gniourf_gniourf's answer 了解替代方案。

这可以用 awk 优雅地表达如下:

awk 'NF {f=1} f' file

两种情况下的输出:

aaa
bbb

cc
dd

说明

这两种方法都通过查找第一个非空行来工作。

sed 模式 /^ *$/d 将删除文件开头的所有空行。接下来是打印文件其余部分的循环。

awk 将为每一行更新NF,当行为空时NF 为零。这被用于设置打印标志 (f)。

【讨论】:

  • 我得到这样的。 sed: 1: "/^$/!{:a;p;n;ba;}": 意外的 EOF(待处理的 })
  • @damienfrancois:为 awk 答案添加了一些解释
  • +1 用于 awk 命令,其他答案中的 sed 命令不起作用。
  • @unxnut 的命令对我不起作用。你能再给你一次吗?
  • @damienfrancois:我太仓促了,没有很好地测试 unxnut 的答案。我已经回滚了我的答案。
【解决方案2】:

一个简单的就是:sed '1,/^$/d' file

它将从第 1 行开始删除到文件实际内容之前的最后一个空白行;根据 OP 的需要保留其他空白行。

【讨论】:

  • 如果有 3 个空行,则在开始时留下 1 个空行,如果有更多空行,则更多。简而言之,此命令仅在正好有 2 个空行时才有效。
  • @Thor:我在这些行中没有任何空格。尝试在输入文件中的aaa 之前插入 5-6 个空行。
  • 请注意,这将删除第一行,即使它不是空行。我知道 OP 没有提到第一行不是空行的可能性,但我认为无论如何都值得一提。
  • @anubhava:你说得对,它不起作用。我测试得不够好。
  • 对 @anubhava 我的错误。
【解决方案3】:

这是另一种在文件开始时使用纯 BASH 方式删除所有空行的方法,而不涉及任何外部实用程序,如 awk/sed:

[[ "$(<file)" =~ ^[[:space:]]+(.*)$ ]] && echo "${BASH_REMATCH[1]}"
aaa
bbb

cc
dd

【讨论】:

  • 最好写[[:space:]]*,以防没有前导空行。否则很酷的方法,但不能真正适应大文件。 :).
  • @gniourf_gniourf:我故意保留为[[:space:]]+ 以避免这个操作如果没有前导空行并且没有什么可以删除。
  • 当文件中没有前导空格时,您的方法会中断,它会从第一个非空行的开头去除空格。
【解决方案4】:

如果这些行真的是空的(没有空格),我会建议

sed -n '/./,$p',否则sed -n $'/[^ \t]/,$p'。 ($'..' 语法使 bash 扩展了 \t,因此您不需要理解它的 sed。)

【讨论】:

  • 非常感谢..这正是我所需要的
【解决方案5】:

一个有趣的可能性:

{ sed -n '/./{p;q}' && cat; } < file

而且它也非常有效! (尝试将其与其他方法进行基准测试)。如果你的第一行可能有一些空格,你可以这样做:

{ sed -n '/[^[:space:]]/{p;q}' && cat; } < file

sed 在读取一个字符之前什么都不做;此时它打印出该行并退出。然后cat 输出整个东西;所以由于没有更多的sed 过滤,数据通过cat 流动得更快!

grep:

{ grep -v -m 1 '^$' && cat; } < file

或丢弃可能有空格的前导行:

{ grep -v -m 1 '^[[:space:]]*$' && cat; } < file

【讨论】:

  • 创意,我喜欢 :)
【解决方案6】:
sed -n "H;$ {x;s/^\n*//p;}"

删除所有第一个 \n ant 考虑到第一行可能不为空(1,/^$/ 在这种情况下不起作用)

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2021-12-22
    • 2011-03-21
    • 2022-01-27
    • 1970-01-01
    • 2021-06-07
    • 2016-12-22
    • 2014-07-05
    相关资源
    最近更新 更多