我想删除所有双引号,除非它们被转义!
我的例子如下:
The quick brown fox "jumps", over the 'lazy \"dog\"'
我想达到以下结果:
The quick brown fox jumps, over the 'lazy \"dog\"'
所以我有以下命令,但它不起作用。
sed -i '/^\/\"/! s/"//g' test.sql
如何编写实现目标的sed命令?
关心Kim
答案 0 :(得分:1)
这可以是一个选项:
$ sed -r 's#([^\])"#\1#g' a
The quick brown fox jumps, over the 'lazy \"dog\"'
从基本sed 's#something#change#g'
开始,它会查找任何something different than \
+ "
并删除它。它还会捕获该字符((something)
)并将其打印回来(\1
)。
对于边缘情况,为described by jthill:
几个角落的情况,-e's /“”* /“/ g'在主要处理之前 连续引号和-e s / ^“//`来处理初始引号。
$ cat a
The quick brown fox "jumps", over the 'lazy \"dog\"'
"The quick brown fox "jumps", over the 'lazy \"dog\"'""
$ sed -re 's/""*/"/g' -e 's/^"//' -e 's#([^\])"#\1#g' a
The quick brown fox jumps, over the 'lazy \"dog\"'
The quick brown fox jumps, over the 'lazy \"dog\"'
答案 1 :(得分:1)
awk
版本(不是最好的方法)
awk '{gsub(/\\\"/,"_#_");gsub(/\"/,x);gsub(/_#_/,"\\\"")}1'
The quick brown fox jumps, over the 'lazy \"dog\"'
此处它将\"
替换为_#_
(这需要一些独特的)
然后删除单个"
并更改回\"
不太便携的gnu awk version
awk '{print gensub(/([^\\])\"/, "\\1", "g")}'
The quick brown fox jumps, over the 'lazy \"dog\"'
好的awk
版本(便携式):
awk '{gsub(/[^\\]"/,"&_");gsub(/"_/,x)}1'
最佳awk
版本(便携式):
awk '{ORS=(/\\$/?RS:x)}1' RS=\"
答案 2 :(得分:0)
在posix sed上使用临时替换(此处为char#)
sed 's/#/#a/g;s/\\"/#b/g;s/"//g;s/#b/\\"/g;s/#a/#/g' File.ext