bash - 如何使用 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"
解决方案
这可以通过一个替代命令完成您所要求的:
$ 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
推荐阅读
- python - 如何使我的代码在列中正确格式化
- google-cloud-functions - Firebase Web + Functions + App 在本地主机上使用模拟器时检查身份验证错误
- javascript - 我使用 Python Flask 和 javascript 构建折线图,但它不起作用,尽管我可以看到值存在于 chrome 检查元素中
- mysql - 在 PHPAdmin 上的 MySQL 上使用 LIMIT 子句的替代方法
- mysql - MySQL:如何将 COALESCE 与 SET 数据类型一起使用?
- sql-server - 在预期条件的上下文中指定的非布尔类型的表达式,靠近“与”,严重性 15
- go - 由于 Format() 在类型 toml.LocalDate 上不可用,站点构建失败
- python - 绘图悬停标签'y统一'不显示相同'y'的值
- javascript - 如何使用 Vue Composition API 作为跨组件的全局状态?
- android - 为什么使用 NetworkBoundResource 时协程始终处于活动状态