如何用Perl仅合并含'/'的多行文本?
问题
我有一个多行字幕格式的文本文件,希望仅当行包含'/'字符时,将该行与下一行合并。目前使用的Perl命令会合并所有符合行数条件的行,无法满足只合并含'/'行的需求。
现有输入文件示例:
$ cat input.txt 1 00:02:34,654 --> 00:02:36,554 Sean, let's go. 2 00:02:38,358 --> 00:02:40,724 Yeah. Detective. we got a possible 1 87 out on Route 59. 3 00:03:04,584 --> 00:03:06,051 Right this way. 4 00:05:01,301 --> 00:05:03,269 How long has this been here?./ Tuesday.
当前执行的命令:
$ cat input.txt | perl -00 -lpe '$i = 0; s/\n/(++$i > 2) ? " " : "\n"/ge'
当前命令执行结果:
1 00:02:34,654 --> 00:02:36,554 Sean, let's go. 2 00:02:38,358 --> 00:02:40,724 Yeah. Detective. we got a possible 1 87 out on Route 59. 3 00:03:04,584 --> 00:03:06,051 Right this way. 4 00:05:01,301 --> 00:05:03,269 How long has this been here?./ Tuesday.
期望输出:
1 00:02:34,654 --> 00:02:36,554 Sean, let's go. 2 00:02:38,358 --> 00:02:40,724 Yeah. Detective. we got a possible 1 87 out on Route 59. 3 00:03:04,584 --> 00:03:06,051 Right this way. 4 00:05:01,301 --> 00:05:03,269 How long has this been here?./ Tuesday.
请问如何修改Perl命令实现该需求?
解决方案
可以通过精准的正则匹配,只针对包含/的行执行合并操作,修改后的命令如下:
cat input.txt | perl -00 -pe 's/(.*\/)\n(.*)/$1 $2/g'
命令说明
-00:启用段落模式,按空行分隔处理文本块,适配字幕的分段结构。s/(.*\/)\n(.*)/$1 $2/g:核心正则匹配逻辑:(.*\/):捕获所有以/结尾的行内容(.*匹配任意字符,\/转义匹配/符号)。\n:匹配该行末尾的换行符。(.*):捕获换行后的下一行完整内容。$1 $2:将捕获的两部分内容用空格连接,完成合并。g:全局匹配标记,处理文本中所有符合条件的行对。
如果想避免多余的cat调用,直接读取文件更高效:
perl -00 -pe 's/(.*\/)\n(.*)/$1 $2/g' input.txt
内容的提问来源于stack exchange,提问作者kuninox
相关产品推荐
相关产品推荐

