Как удалить '\ r \ n' из моего текстового файла, используя пакетный файл или curl? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть команда 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 есть способ фильтрации, но я не уверен, так как я не использовал оба.

Ответы [ 4 ]

0 голосов
/ 15 февраля 2019

Для решения Unix-y, как насчет

curl ... things | awk "{printf("\""%s"\"",$0)}' >output

(цитата из DOS взята из Документация Gawk ; надеюсь, она все еще актуальна.)

0 голосов
/ 14 февраля 2019

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

Пример вывода:

enter image description here

0 голосов
/ 15 февраля 2019

Любое разумное пакетное решение будет манипулировать строками в строках переменных среды.Но максимальная длина переменной, которую может обработать пакет, составляет около 8191 символа.Вполне возможно, что вывод CURL может превышать эту длину, поэтому чистая пакетная обработка, вероятно, не является хорошим вариантом.

Существует ряд языков сценариев, родных для Windows, которые могут легко обрабатывать текст произвольной длины, например JScript, VBScript, PowerShell.

Существуют также легкодоступные сторонние инструменты командной строки, которые могут манипулировать текстом, включая порты Windows утилит unix.Например, sed можно найти для Windows.

Я бы использовал мою JREPL.BAT утилиту для обработки текстовых выражений с регулярными выражениями , так как она всегда у меня под рукой, и она проста и удобна :-)это чистый скрипт (гибридный пакет / 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 -
0 голосов
/ 14 февраля 2019

Вот возможное решение:

@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 содержит &.Замените его на ^&, чтобы оно заработало!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...