求一个 sed 脚本 转义行中的引号

2020-08-16 09:02:20 +08:00
 yanshenxian

例如某个文件内容是 (title 值以及其中的引号内容并不是固定的,且有可能出现多处内嵌引用)

...第一行内容
title = "标题中的"引号内容"需要转义" 
...第三行及剩下的内容

需要修改成

...第一行内容
title = "标题中的\"引号内容\"需要转义" 
...第三行及剩下的内容
1900 次点击
所在节点    Linux
10 条回复
lululau
2020-08-16 09:41:19 +08:00
原始文本没有转义,怎么判定嵌套层级?你倒是说下规则啊
yanshenxian
2020-08-16 10:13:24 +08:00
@lululau 原始文本格式是 title = "{{标题内容}}" ,把 {{标题内容}} 的里面包含的引号转义掉就行,不需要考虑嵌套
yanshenxian
2020-08-16 10:14:09 +08:00
写了一版粗糙的 不知道怎么优化
find ./ -type f | xargs sed -i -e '2s/"/\\"/g' -e '2s/\\"/"/' -e '2s/\(.*\)\\"/\1"/'
rrfeng
2020-08-16 10:20:15 +08:00
意思是把非首尾的“换掉就行了吧?
yanshenxian
2020-08-16 10:30:06 +08:00
@rrfeng en 是这样的。。
freedomSky
2020-08-16 11:06:36 +08:00
sed -i '2{s/title = "\(.*\)"/\1/;s/"/\\"/g;s/\(.*\)/title = "\1"/;}' data.txt
好像 sed 没办法直接对 group 项做处理吧
vhysug01
2020-08-16 12:13:25 +08:00
每次看到这么复杂的,我直接拿脚本语言处理的。怎么方便怎么来
ruidoBlanco
2020-08-16 12:51:27 +08:00
awk -F\" 'NR!=2; NR==2 { OFS="\""; for(i=2; i<NF-1; i++) $i=$i"\\" ; print }'
rrfeng
2020-08-16 16:14:33 +08:00
s/"/\\"/g;s/^\\//;s/\\"$/"/

先替换所有的,再把头尾去掉。
rrfeng
2020-08-16 16:15:16 +08:00
或者加断言引号不是开头或者结尾的,再替换

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/698609

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX