sed、単一のバックスラッシュを二重バックスラッシュに変換

sed、単一のバックスラッシュを二重バックスラッシュに変換

二重エスケープ/単一エスケープ改行文字を含む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

関連情報