我有一个curl
命令:
curl -H "Accept: application/json" -H "content-type: application/x-www-form-urlencoded" -X POST -d "*****messsage_request******" https://******/api/ > "C:\Users\abc\Desktop\outputfile.json"
它的输出是JSON格式(我把这个输出放在一行):
[{"title_name":"abc","title_number":"1","title_des":"this is the title \r\nof the new song\r\n abc","add_comments":"Yes, I like \r\nthis song"},{"title_name":"efgh","title_number":"2","title_des":"\r\nthis is the title of the new song efgh","add_comments":"would\r\n there be parking spot\r\n"}]
我想从中删除\r\n
。 \r\n
可以在任何地方。
我试图替换:
-d
附:
--data-binary
但它没有用。
我可以使用批处理文件或者我认为curl有一种方法可以过滤,但我不确定,因为我没有使用过多。
IMO PowerShell更适合处理Json输出,尤其是多行数据
## Q:\Test\2019\02\14\SO_54696007.ps1
# $Json = curl.exe --% -H "Accept: application/json" -H "content-type: application/x-www-form-urlencoded" -X POST -d "*****messsage_request******" https://******/api/
# simulateed input
$Json = '[{"title_name":"abc","title_number":"1","title_des":"this is the title \r\nof the new song\r\n abc","add_comments":"Yes, I like \r\nthis song"},{"title_name":"efgh","title_number":"2","title_des":"\r\nthis is the title of the new song efgh","add_comments":"would\r\n there be parking spot\r\n"}]'
$Table = $JSon | ConvertFrom-Json
$Table | Out-GridView
样本输出:
任何合理的批处理解决方案都会操纵环境变量字符串但批处理可以处理的最大可变长度大约为8191个字符。可以想象,CURL输出可能超过该长度,因此纯批次可能不是一个好的选择。
Windows中有许多原生脚本语言可以轻松处理任意长度的文本,例如JScript,VBScript,PowerShell。
还有随时可用的第三方命令行工具,可以操作文本,包括unix实用程序的Windows端口。例如,可以在Windows中找到sed。
我会使用我的JREPL.BAT regular expression text processor实用程序,因为我总是把它放在手边,它简单方便:-)它是纯脚本(混合批处理/ JScript),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方exe。
curl --YourArguments | jrepl \r\n "" /L >"yourOutputFile.json"
要么
curl --YourArguments | jrepl \r\n "" /L /O "yourOutputFile.json"
/L
选项将搜索词视为字符串文字,这是您想要的。
如果您想先捕获curl输出,然后使用JREPL进行后处理,那么
curl --YourArguments >"yourOutputFile.json"
call jrepl \r\n "" /L /F "yourOutputFile.json" /O -
对于Unix-y解决方案,怎么样
curl ... things | awk "{printf("\""%s"\"",$0)}' >output
(DOS引用从Gawk documentation收集;我希望它仍然是最新的。)
这是一个可能的解决方案:
@echo off
(curl -H "Accept: application/json" -H "content-type: application/x-www-form-urlencoded" -X POST -d "*****messsage_request******" https://******/api/)>"C:\Users\abc\Desktop\outputfile.json"
for /F "delims=" %%A IN (C:\Users\abc\Desktop\outputfile.json) do (
set "line=%%A"
)
echo %line:\r\n=%
这里更通用(从上面改编):
@echo off
(curl -H "Accept: application/json" -H "content-type: application/x-www-form-urlencoded" -X POST -d "*****messsage_request******" https://******/api/)>"C:\Users\abc\Desktop\outputfile.json"
for /F "delims=" %%A IN (C:\Users\abc\Desktop\outputfile.json) do (
set "line=%%A"
call echo %line:\r\n=%
)
这个,将echo
输出到cmd,但该文件将保留\r\n
。要修改文件,请使用:
@echo off
(curl -H "Accept: application/json" -H "content-type: application/x-www-form-urlencoded" -X POST -d "*****messsage_request******" https://******/api/)>"C:\Users\abc\Desktop\outputfile.json"
for /F "delims=" %%A IN ('type "C:\Users\abc\Desktop\outputfile.json"') do (
set "line=%%A"
call echo %line:\r\n=%>"C:\Users\abc\Desktop\outputfile.json"
)
但是,建议的方法如下:
@echo off
for /F "delims=" %%A IN ('curl -H "Accept: application/json" -H "content-type: application/x-www-form-urlencoded" -X POST -d "*****messsage_request******" https://******/api/') do (
set "line=%%A"
call echo %line:\r\n=%>"C:\Users\abc\Desktop\outputfile.json"
)
这是一个很好的分拣机。
%line:\r\n=%
意味着在变量line
(文件内容)中搜索字符串\r\n
并用任何东西替换它(=
),所以只需删除它。
注意:您已经提到过curl
命令包含&
。用^&
替换它以使其工作!