二重エスケープ/単一エスケープ改行文字を含むjson文字列があります。 Jsonパーサーは、文字列値に単一のバックスラッシュエスケープを許可しません。
脱出するにはすべて集める必要があります
内容は次のとおりです。
this newline must not be changed ---- \\n
this newline must be changed - \n
sed コマンドを実行すると、
sed -i 's/([^\])\n/\\n/g' ~/Desktop/sedTest
それは何も置き換えません
([^\])
\n
、このモードは、すでにバックスラッシュのあるモードを変更しないために使用されます。
答え1
例の入力を考えると、次のようになります。
$ cat /tmp/foo
this newline must not be changed ---- \\n
this newline must be changed - \n
これはあなたが望むことを行うようです:
$ sed -e 's@\([^\]\)\\n@\1\\\\n@' /tmp/foo
this newline must not be changed ---- \\n
this newline must be changed - \\n
答え2
努力する
sed -i 's,\([^\\]\)\\n,\1\\\\n,' file
sed -i 's,\([^\]\)\\n,\1\\\\n,' file
どこ
\
次に脱出する必要があります。\\\\
\( .. \)
キャプチャモードです\1
右側には最初にキャプチャされたパターンがあります。- 2番目の形式は@cuonglmが提案した
\
単一の形式です。[^\]
パターンを保存する必要があります。それ以外の場合は破棄されます。
答え3
LHSでは、\n
リテラルの代わりに改行文字を一致させようとします\n
。
努力する:
sed -e 's/\([^\]\)\(\\n\)/\1\\\2/g' file
またはより短い拡張正規表現:
sed -E 's/([^\])(\\n)/\1\\\2/g' file