首页 > 解决方案 > 如何使用 unix shell 脚本/命令将文件中的单引号 (') 替换为双引号 (")?不能替换撇号

问题描述

我试图在 Unix 的文件中只用双引号 (") 替换单引号 (') 而不是撇号 (')。撇号 (') 必须保持原样。

我通过按顺序执行的 3 个 sed 命令获得了所需的输出。但是,我无法解决最后一行“假新闻”。

sed -i 's/'\''/"/g' test.txt

sed -i 's/"s/'\''s/g' test.txt

sed -i 's/s"/s'\''/g' test.txt

第一个 sed - 将所有单引号转换为双引号。

第二个 sed - 将所有双引号(后跟 s)转换为单引号。

第三个 sed - 将所有 s 后跟双引号的单引号转换。

输入文件 -

Hello Sir!
How are you?
How's your health?
All 'good'?
Charles' here.
'fake news'

预期输出-

Hello Sir!
How are you?
How's your health?
All "good"?
Charles' here.
"fake news"

标签: bashshellsedksh

解决方案


这可以通过一个替代命令完成您所要求的:

$ sed -E "s/'([^']*)'/\"\1\"/g" file
Hello Sir!
How are you?
How's your health?
All "good"?
Charles' here.
"fake news"

以上通过用双引号对替换单引号对来工作。

'([^']*)'匹配单引号后跟除单引号后跟单引号之外的任何字符。单引号内的字符保存在捕获组 1 中。替换,\"\1\",获取捕获组并将其放在双引号内。

虽然这可以处理您要求的案例,但很容易想象如果没有复杂的语言分析就无法处理更复杂的案例。

另类风格

与上面相同的命令可以用另一种(但等效的)shell 引用样式编写:

sed -E 's/'\''([^'\'']*)'\''/"\1"/g' file

推荐阅读