我想删除所有双引号,除非它们被转义!
我的例子如下:
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 命令来实现我的目标?
问候金
这可以是一个选项:
$ 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\"'
一个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=\"
在 posix sed 上使用临时替换(此处为 char # )
sed 's/#/#a/g;s/\\"/#b/g;s/"//g;s/#b/\\"/g;s/#a/#/g' File.ext