xargs:如何替换文字双引号?

时间:2014-07-16 15:52:51

标签: json bash curl xargs

我有一个带有JSON-Objects的源文件,每行一个:

源:

{"_id":"1","name":"one"}
{"_id":"2","name":"two"}
{"_id":"3","name":"three"}

我想将每一行发送到

curl -X POST -H "application/json" myURL -d '<REPLACEMENT>'

当我尝试

时,双引号不会使它卷曲
<source xargs -I % curl -X POST -H "application/json" myURL -d '%'

我尝试在curl命令中转义引号,后来我用\“替换了源文件中的所有双引号。我发现没有版本可以工作。

使用seq将seq写入临时文件和curl -d @temp的另一种方法对我来说没有用。

是否有一个优雅的解决方案,还是我必须用循环编写脚本?

4 个答案:

答案 0 :(得分:4)

这是一个有趣的问题。必须有一个更好的解决方案(也许konsolebox可以用于某些东西),但用"替换所有\"将起作用:

$ echo '"hello"'
"hello"
$ echo '"hello"' | xargs echo
hello
$ echo '"hello"' | sed 's/"/\\"/g' | xargs echo
"hello"

答案 1 :(得分:1)

GNU Parallel专门用于处理xargs对特殊字符的错误处理:

<source parallel curl -X POST -H "application/json" myURL -d {}

它不仅会正确引用,它会正确引用任何字符串,因此它将被curl解释为单个参数。

添加了奖励:您的查询将并行运行 - 每个CPU一次查询。

答案 2 :(得分:1)

应该做的诀窍:

cat source.json | xargs -0 -I {} curl {}

来自man xargs

  -0, --null
         Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (ev‐
         ery  character  is  taken  literally).  Disables the end of file string, which is treated like any other argument.  Useful
         when input items might contain white space, quote marks, or backslashes.  The GNU find -print0 option produces input suit‐
         able for this mode.

答案 3 :(得分:0)

尝试使用--data-urlencode

<source xargs -I % curl -X POST -H "application/json" myURL --data-urlencode '%'

该选项可与其他格式一起使用。请参阅curl的手册。您也可以尝试--data-binary