uniq-报告或忽略重复的行

uniq-报告或忽略重复的行

关于这是重复的:还有类似措辞的问题,例如https://unix.stackexchange.com/questions/76061/can-sed-remove-double-newline-characters或者https://stackoverflow.com/questions/27510462/how-can-i-remove-double-line-breaks-with-sed- 首先,虽然原始问题可能与我的相同,但其被接受且获得最多点赞的问题删除了所有空行,而不仅仅是像问题中提到的“当有 2 个或更多空行在一起时”。一些评论抱怨这个答案,其他人也这样做,但没有给出留下一个空行的答案。其他一些答案将重复的空行变成一个空行(压缩),而不是完全删除它们。


我正在寻找一种可编写脚本的方法来删除连续的空行,但保留单个空行。

我正在寻找自动清理.srt(字幕)文件的方法。该格式要求字幕部分之间有换行符(在特定时间内显示的内容)。通常,如果一次要显示 2 行,字幕作者就只有 2 行。有些作者使用另一种风格,即在要显示的行之间放置 2 个空行。在我的设备上,这样做的效果是只显示第一行,并且可能将第二行从电视上渲染出来。

因此我想改变这一点:

1
00:00:01,800 --> 00:00:03,802
    First line is here


    Second line is here

2
...

变成这样:

1
00:00:01,800 --> 00:00:03,802
    First line is here
    Second line is here

2
...

并不是说它可能需要以不同的方式处理,但是文件格式要求文件底部有一个空行,必须留在那里。

我希望它能正常工作,首先删除尾随空格,然后仅删除与另一个空行接触的所有空行。我不希望它基于其余格式进行固定.srt,例如与编号部分之间有多少行有关。(我曾想过可以删除所有空行,并且可以在仅包含数字字符的行上重新添加换行符,但我希望保持它比这更通用,忽略实际格式.srt。)

此外,如果由于某种原因,.srt文本超过 2 行,我希望保留原样。

因此,或许可以这样理解:

cat some.srt | sed 's/[ \t]*$//' | SOMETHING_ELSE

我更喜欢bashsedawk解决方案,而不是 一个perl。如果我理解正确的话,我认为awk比 、 更容易实现sed,因为它是多行的。

答案1

如果文件中其余相邻行都是唯一的,并且只想删除相邻的空白行,则可以使用uniq

uniq-报告或忽略重复的行

从 INPUT(或标准输入)中过滤相邻匹配的行,写入 OUTPUT(或标准输出)。

如果没有选项,匹配的行将合并到第一次出现的行。

运行示例文件后将返回:

$ uniq testfile
1
00:00:01,800 --> 00:00:03,802
    First line is here

    Second line is here

2
...

附言:您的示例并未按照主题所要求的方式执行,它删除了第一行和第二行之间的所有空行 - 它没有留下任何空行。

有趣的是,在示例文件上使用uniq -u(仅打印唯一的行)会在示例输出中给出结果(它会删除两个空白行,在第一行和第二行之间不留任何空白行):

$ uniq -u testfile
1
00:00:01,800 --> 00:00:03,802
    First line is here
    Second line is here

2
...

相关内容