【问题标题】:Merge two blank lines into one将两个空行合并为一个
【发布时间】:2014-08-13 22:33:37
【问题描述】:

我正在寻找将文件 A 转换为文件 B 的解决方案,这需要将两个空行合并为一个。

文件-A:

// Comment 1
// Comment 2

// Comment 3


// Comment 4



// Comment 5

文件-B:

// Comment 1
// Comment 2

// Comment 3

// Comment 4

// Comment 5

来自this post,我知道如何删除空行,我想知道如何将两个连续的空行合并为一个。

PS:空白意味着它可能是空的,或者行中可能有一个制表符或空格。

【问题讨论】:

  • 你喜欢每行之间有一个空行,即使是连续的三个空行。请给出示例输出。
  • 我认为我可以在 2+ 空行的情况下使用循环,所以我没有问这个问题。你的意思是有2+空行的答案?
  • 好的,我的回答是我认为你喜欢做的:)

标签: bash sed


【解决方案1】:
sed -r 's/^\s+$//' infile | cat -s > outfile

sed 删除空白行上的所有空格。 cat-s 选项将连续的空行压缩为一个。

【讨论】:

  • 这行得通,谢谢。是否可以“就地”进行编辑?
  • +1;工具的巧妙组合,尽管语法是 GNU sed 特定的。符合 POSIX 的替代方案:sed 's/^[[:blank:]]\{1,\}$//' file | cat -s > outfile.
  • @Daniel:您必须使用标准的习惯用法来解决无法执行就地更新的问题:使用> outfile,而不是> /tmp/tmp.$$ && move /tmp/tmp.$$ infile
【解决方案2】:

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

sed '$!N;s/^\s*\n\s*$//;P;D' file

这会将 2 个空行转换为一个。

如果要将多个空行替换为一个:

sed ':a;$!N;s/^\s*\n\s*$//;ta;P;D' file

经过反思,一个更简单的解决方案是:

sed ':a;N;s/\n\s*$//;ta' file

将一个或多个空行压缩成一个空行。

一个更简单的解决方案是使用范围条件:

sed '/\S/,/^\s*$/!d' file

这将删除除非空行之后的所有空行。

【讨论】:

  • 你能解释一下!N;;P;D部分吗?
  • @MarkZar 请参阅here,但请先查看我最近的编辑以获得更好的解决方案。
【解决方案3】:

这是一个简单的解决方案,awk

awk '!NF && !a++; NF {print;a=0}' file
// Comment 1
// Comment 2

// Comment 3

// Comment 4

// Comment 5

NF统计字段数;请注意,完全由空格和制表符组成的行也算作空行。
a 用于计算空行,如果超过 1,则跳过它。

【讨论】:

    【解决方案4】:

    This page 可能会派上用场。 TL;DR 如下:

    # delete all CONSECUTIVE blank lines from file except the first; also
    # deletes all blank lines from top and end of file (emulates "cat -s")
    sed '/./,/^$/!d'          # method 1, allows 0 blanks at top, 1 at EOF
    sed '/^$/N;/\n$/D'        # method 2, allows 1 blank at top, 0 at EOF
    

    【讨论】:

    • 如果存在spaces 和或tabs,则此操作失败。 OP 请求 PS: empty could also mean that there might be a tab or a space in the line.
    【解决方案5】:

    这应该可行:

    sed 'N;s/^\([[:space:]]*\)\n\([[:space:]]*\)$/\1\2/;P;D' file
    

    【讨论】:

    • @Daniel 如果您提供示例输入和/或描述问题,我可以调查一下。
    【解决方案6】:
    awk -v RS='([[:blank:]]*\n){2,}' -v ORS="\n\n" 1 file
    

    我曾希望制作一个较短的 Perl 版本,但 Perl 不使用正则表达式作为其记录分隔符。

    awk 不会就地编辑。你必须这样做:

    awk -v RS='([[:blank:]]*\n){2,}' -v ORS="\n\n" 1 file > tmp && mv tmp file
    

    【讨论】:

    • 提醒:需要将正则表达式识别为记录分隔符(非 POSIX)的 awk 实现,例如 GNU awk。输出中尾随的\n\n 很尴尬。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多