如何替换SRT字幕文件中成对出现的双引号为指定弯引号?
问题原因分析
你写的sed命令存在3个核心问题:
- 正则分组逻辑错误:你保留了捕获到的原
"符号(\1、\3),等于在原有引号基础上额外新增了目标符号,自然输出不符合预期 - sed默认逐行处理,无法匹配跨行的成对引号
- 贪婪匹配规则:
.+会默认匹配到行末尾最后一个",如果一行内存在多对引号会出现匹配错误
正确实现方案
推荐使用兼容性更好的Perl命令实现需求,完美支持跨行匹配、非贪婪匹配,命令如下:
perl -0777 -pe 's/"(.*?)"/„$1”/gs' 输入文件.srt > 输出文件.srt
参数解释
-0777:将整个文件一次性读入内存处理,而非默认逐行读取,支持跨行成对引号匹配.*?:非贪婪匹配,只会匹配到距离最近的下一个",避免多对引号场景的匹配混乱g:全局替换所有符合规则的成对引号s:让通配符.可以匹配换行符,适配跨行引号场景
效果验证
对示例SRT文件执行上述命令后,输出结果符合要求:
104 00:10:25,332 --> 00:10:27,876 Kobieta mówi do drugiej: „Widzisz to, co ja?” 105 00:10:28,001 --> 00:10:30,904 A tamta: „No to co? Każdy wygląda tak samo.”
如果是GNU sed环境,也可以用如下命令实现:
sed -z 's/"\([^"]*\)"/„\1”/g' 输入文件.srt > 输出文件.srt
注意macOS自带的BSD sed不支持-z参数,需要先安装GNU sed(brew install gnu-sed)后用gsed执行。
内容的提问来源于stack exchange,提问作者menteith
相关产品推荐
相关产品推荐

