假设somefile包含内容
a
b
c
我希望每一行都变成3个http POST curl命令。所以第3行会将“c”发布到某个网址。
我可以使用bash循环遍历文件并像这样转储到卷曲
cat somefile | while read line; \
do curl -XPOST 'www.example.com' -d "$line"; \
done
然而,line是一个巨大的json文件,有时通过命令行传递它会产生奇怪的事情。我宁愿有这样的东西
cat somefile | parallel curl -XPOST example.com -d @-
其中'@ - '表示每行文件都通过stdin传递给curl。 gnu parallel可以接受{}作为一个类似于上面“$ line”的参数,但我想在将文件传递给下一个命令之前将文件转换为一行文件。
答案 0 :(得分:1)
Line 1:
cat somefile | while read line; \
^-- SC2162: read without -r will mangle backslashes.
这可以解释它对JSON做了奇怪的事情,JSON经常使用反斜杠:
$ echo '{ "key": "some value with \"nested quotes\" here" }' | \
while read line; do echo "$line"; done
{ "key": "some value with "nested quotes" here" }
添加-r
会让他们独自一人:
$ echo '{ "key": "some value with \"nested quotes\" here" }' | \
while read -r line; do echo "$line"; done
{ "key": "some value with \"nested quotes\" here" }
完全正确的是,while IFS= read -r line
也应保留前导空格。
默认情况下,除非指定了-r选项,否则<反斜杠>应充当逃避品格。未转义的<反斜杠>应保留以下字符的字面值,但<换行取代。如果<换行符>遵循<反斜杠&gt ;,读取实用程序应将此解释为行继续。 <反斜杠>和<换行符>在将输入拆分为字段之前应将其删除。所有其他未转义的<反斜杠>将输入分成字段后,应删除字符。
答案 1 :(得分:1)
cat somefile | parallel 'echo {} | curl -XPOST example.com -d @-'
答案 2 :(得分:1)
cat somefile | parallel --pipe -N1 curl -XPOST example.com -d @-