如何使用Unix Shell脚本/命令在文件中用单引号(')替换双引号(“)?不能替换撇号

时间:2019-06-15 18:44:26

标签: bash shell sed ksh

我正在尝试在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)转换为单引号。

第3个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"

3 个答案:

答案 0 :(得分:1)

这可以用一个替代命令来完成您的要求:

$ 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

答案 1 :(得分:0)

要复制三个sed,可以使用一个perl正则表达式:

perl -p -e 's/([^s])'\''([^s])/$1"$2/g' test.txt

编辑:“假新闻”案例

您可以使用以下方式处理“假新闻”案件的一半:

perl -p -e 's/([^s]|^)'\''([^s])/$1"$2/g' test.txt

要管理“新闻”案件,需要定义可接受单引号的单词列表(名称和姓氏)。否则,您可以添加以下过程,以在不以大写字母开头的单词之后更改引号:

perl -p -e 's/([^\w][a-z]+)s'\''/$1s"/g' test.txt

在“单个”命令(带有管道)中:

perl -p -e 's/([^s]|^)'\''([^s])/$1"$2/g' test.txt | perl -p -e 's/([^\w][a-z]+)s'\''/$1s"/g' 

给出:

  

您好先生!

     

你好吗?

     

你的健康状况如何?

     

所有“好”吗?

     

查尔斯在这里。

     

“假新闻”

     

“假新闻”

答案 2 :(得分:0)

您可以在一次sed调用中运行所有命令:

sed 's/'\''/"/g;s/"s/'\''s/g;s/s"/s'\''/g'

sed -e 's/'\''/"/g' -e 's/"s/'\''s/g' -e 's/s"/s'\''/g'