我有一个 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
右侧是第一个捕获的模式。- 根据 @cuonglm 建议,第二种
\
形式是单曲。[^\]
您需要保留该模式,否则它将被丢弃。
答案3
在\n
LHS 中,您尝试匹配换行符而不是文字\n
。
尝试:
sed -e 's/\([^\]\)\(\\n\)/\1\\\2/g' file
或更短的扩展正则表达式:
sed -E 's/([^\])(\\n)/\1\\\2/g' file