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

バージョン (最善の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 に答える
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

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 に答える