替换成对出现的双引号
Posted
技术标签:
【中文标题】替换成对出现的双引号【英文标题】:Replace double quotes that come in pairs 【发布时间】:2021-09-28 23:47:02 【问题描述】:我想 "
字符。让我解释一下我的意思。
"Some sentence"
这里的双引号应该被替换,因为它们是成对出现的。
"Some sentence
此处不应替换 - 第一个引号字符没有匹配的对。
我想用„
替换第一个引号字符。
❯ echo „ |hexdump -C
00000000 e2 80 9e 0a
第二个引号字符为”
❯ echo ” |hexdump -C
00000000 e2 80 9d 0a
总结如下:
Hi, "how
are you"
更换后应如下所示。
Hi, „how
are you”
我想出了以下代码,但它无法正常工作:
'sed -r s/(\")(.+)(\")/\1\xe2\x80\x9e\3\xe2\x80\x9d/g'
" hi "
给出"„"”
。
编辑 根据 cmets 的要求,这里有一个来自要修改的文件的示例。重要提示:该文件是结构化的 - 也许它可能会有所帮助。该文件始终为 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."
【问题讨论】:
是的,它需要。我想在电影字幕中做一些替换,双引号可能从一行开始,但在下一行甚至更远的地方结束。 是的,文件是结构化的。一些信息在这里:ai-media.tv/what-is-an-srt-file-and-how-to-use-one。但是,如果可能,最欢迎使用通用解决方案。 【参考方案1】:您的表达式不起作用,因为您有三个捕获组:三组()
。您将第一个(第一个引号)和第三个(最后一个引号)放在输出中并忽略第二个,这是您要保留的部分。
没有理由捕获引号,因为您不想将它们注入到输出中。只需要捕获中间的位。
还有一个缺陷,(.*)
本身会匹配包含引号的字符串。所以/"(.*)"/
将匹配整个序列"one"two"
,捕获(.*)
,匹配one"two
。使用[^"]*
匹配一系列非引号字符。
解决这个问题,并使用 -z 将整个文本文件视为一行,这仅在文本文件中没有 nul 字符时才有效,看来这是有效的:
sed -zE 's/"([^"]+)"/„\1“/g'
【讨论】:
这是否适用于文本文件(LF 终止)? 似乎对我有用。 sed 的非 GNU 版本可能不支持 -z。【参考方案2】:sed -rn ':a;s/"([^"]*)"/„\1”/g;/"/!p;b;;$p;N;ba'
它将所有"xx"
替换为„xx”
。如果结果不再包含"
,它会被打印出来,然后我们从下一行重新开始。否则我们连接下一行并重新启动。 $p
只是在这里打印最后几行,如果它们包含一个悬空的"
。
【讨论】:
也许用-z
啜饮整个文件可能有效?即sed -Ez 's/"([^"]*)"/„\1”/g' file
@potong 对于小文件是的。不确定它如何与大文件一起扩展。你知道吗?我有兴趣。以上是关于替换成对出现的双引号的主要内容,如果未能解决你的问题,请参考以下文章
CSV文件的双引号怎么去掉。用记事本打开有双引号,EXCEL打开又没有了,怎么样去掉这个双引号,这是个啥