替换成对出现的双引号

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 对于小文件是的。不确定它如何与大文件一起扩展。你知道吗?我有兴趣。

以上是关于替换成对出现的双引号的主要内容,如果未能解决你的问题,请参考以下文章

用R中的双引号替换转义的双引号

C#替换“/ with” - 带双引号和其他的双引号反弹

CSV文件的双引号怎么去掉。用记事本打开有双引号,EXCEL打开又没有了,怎么样去掉这个双引号,这是个啥

如何用撇号替换字符串中的双引号(不是指定它是字符串的外部双引号)

sql server 如何去除双引号

shell中的   中文和英文   双引号