我正在尝试在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"
答案 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'