【问题标题】:Printing every block of data containing 11 lines打印包含 11 行的每个数据块
【发布时间】:2015-08-20 17:59:56
【问题描述】:

我有一个文件,其中的文本分为 11 行或 10 行的块(每个块由一个新行分隔)。我只想提取 11 行块。是否有任何 sed 命令可以让我指定 11 个模式(每行每个模式)并仅在完全匹配时打印它们(整个块)?

干杯

【问题讨论】:

  • “由新行分隔”表示数据块之间有一个空行分隔?是的,如果选择在10到11之间就可以;经常使用 N 命令(10 或 11 次)并检查最后一行是否为空。但这并不漂亮。如果也可以有 9 条(或 12 条)行,那么我认为它会变得更加棘手。
  • 是的,有一个空行分隔数据块。我只有 10 和 11 行块。你能画出它的样子吗(这个 N 命令解决方案)?
  • 您接受的awk 解决方案更易于理解且更健壮。虽然你可以在sed 中这样做,但我真的认为它不合适。

标签: linux sed


【解决方案1】:

我知道您要求使用 sed,但 GNU awk 使这项任务变得简单:

awk -F'\n' -v RS= 'NF==11' file

-v RS= 告诉 awk 使用空行作为其记录分隔符。

在 awk 中,每条记录都分为字段。 -F'\n' 告诉 awk 使用换行符作为字段分隔符。

NF==11 告诉 awk 只有在记录由 11 行组成时才打印它。

【讨论】:

  • 现在好了。太感谢了! :)
【解决方案2】:

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

sed -nr ':a;N;$G;s/\n+$//;Ta;s/[^\n]+/&/11p' file

使用-n 类grep 选项和-r 扩展正则表达式选项。

将行追加到模式空间直到空行。如果模式空间包含 11 行(或更多),则打印它。

注意在最后一行可能为空或不为空的边缘情况下添加换行符。

仅适用于 11 行:

sed -nr ':a;N;$G;s/\n+$//;Ta;/^([^\n]+\n){10}[^\n]+$/p' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2019-03-29
    • 2012-12-04
    • 1970-01-01
    • 2021-10-02
    • 2015-02-01
    • 1970-01-01
    相关资源
    最近更新 更多