You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:34:53