替换未使用sed转义的双引号

时间:2013-10-24 09:00:11

标签: regex sed

我想删除所有双引号,除非它们被转义!

我的例子如下:

 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

3 个答案:

答案 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