2

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

我的例子如下:

 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 命令来实现我的目标?

问候金

4

3 回答 3

1

这可以是一个选项:

$ sed -r 's#([^\])"#\1#g' a
The quick brown fox jumps, over  the 'lazy \"dog\"'

从 basicsed 's#something#change#g'中,它会查找任何something different than \+"并将其删除。它还捕获该字符 ( (something)) 并将其打印回来 ( \1)。

对于边缘情况,如jthill 所述

几个极端情况,在主要情况之前 -e 's/""*/"/g' 处理连续引号, -es/^"//` 处理初始引号。

$ 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\"'
于 2013-10-24T09:03:11.790 回答
1

一个awk版本(不是最好的方法)

awk '{gsub(/\\\"/,"_#_");gsub(/\"/,x);gsub(/_#_/,"\\\"")}1'
The quick brown fox jumps, over  the 'lazy \"dog\"'

在这里它替换\"to _#_(这需要是一些唯一的)
然后它删除单"并改回\"


一个不太便携的 gnuawk 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=\"
于 2013-10-24T11:14:06.010 回答
0

在 posix sed 上使用临时替换(此处为 char # )

sed 's/#/#a/g;s/\\"/#b/g;s/"//g;s/#b/\\"/g;s/#a/#/g' File.ext
于 2013-10-24T13:51:04.660 回答