Shell:用“\\ n”替换每个新行“\ n”字符

时间:2014-08-22 15:41:12

标签: json perl shell scripting escaping

我将已更改文件的git diff插入到JSON对象中,以使用curl请求发送。

问题是它不喜欢插入JSON中的新行字符,但我不知道如何解决这个问题。翻译工具没有用,我使用的这个perl解决方案很接近但只是替换为空格:

changedfiles=$(git diff --name-only $3..$4 | perl -p -e 's/\n/ /')

并将其更改为没有帮助:

changedfiles=$(git diff --name-only $3..$4 | perl -p -e 's/\n/\\n/')

有人能指出我正确的方向吗?它不需要使用perl,它只需要工作 (......简单也会很好)

2 个答案:

答案 0 :(得分:0)

我认为你想要做的是用逗号分隔引用的文件列表(即插入JSON字符串):

git diff --name-only $3..$4 | perl -p -e 's/(.*)/"$1",/;s/\n//;s/""/","/'

如果您的文件不包含双引号或需要进行JSON转义的特殊字符,则此方法有效。

首先,我们将文件放在引号后面加一个逗号,然后删除换行符,然后将文件之间的""更改为","。虽然,这是一种黑客攻击。可能会更好:

git diff --name-only $3..$4 | perl -p -e '$/="";s/(.*)\n/"$1",/g;s/,$//'

这里我们读完整个输入,换行符和所有内容,替换并删除最后一个逗号。

答案 1 :(得分:0)

不是试图对即时测试发现问题的字符进行临时转义,而是如何使用实际的JSON库以可靠的方式处理所有这些?

以下是使用内联python的bash示例:

python -c '
import json
import sys
print(json.dumps({"data": sys.argv[1]}))
' "$(git diff --name-only $3..$4)"

它打印json对象{ "data": "your command output here" },符合标准的转义。