如何通过sed将\n更改为空格并将\n\n更改为\n?

如何通过sed将\n更改为空格并将\n\n更改为\n?

我用来sedsrt文件转换为常规文本文件。Ansrt` 文件的格式为

1
00:20:41,150 --> 00:20:45,109
line 1
line 2

2
00:21:41,150 --> 00:21:45,109
line 3
line 4

所以我使用以下命令删除非文本行

sed -r '/^[0-9]+$/{N;d}' file.srt > file.txt

产生

line1
line2

line3
line4

但我想得到

line1 line2
line3 line4

(每个字幕段作为一行)

我怎样才能做到这一点?

答案1

用它来获取你的模式

sed ':begin;$!N;s/\n/ /;tbegin' file.txt | sed 's/  /\n/g'

答案2

您应该能够使用以下方法来完成此操作awk通过在“段落模式”下操作它来完成此操作(例如,参见@EdMorton的解决方案这里以及“打印除第一个字段之外的所有字段”问题的解决方案来自堆栈溢出

awk -v RS= -F'\n' '{$1=$2=""; print $0}' file.srt > file.txt

这会将任何“空行”分隔的文本块解释为一个输入记录,其字段是文本块的各个行。然后,上述命令将用“空”字符串替换前两个字段(=行)并打印整行。

请注意,这会在“实际输出”之前留下两个空格(输出字段分隔符)。如果这是一个问题,您可以使用 -internal 循环显式仅打印剩余字段awk

awk -v RS= -F'\n' '{for (i=3; i<NF; i++) printf("%s ",$i); printf("%s\n",$NF)}' file.srt > file.txt

相关内容