Как извлечь все из двух шаблонов (используя sed?)? - PullRequest
1 голос
/ 22 января 2020

Я запускаю команду curl (плюс grep) и хочу извлечь из выходных данных все между двумя шаблонами.

Вот пример вывода из curl (и grep):

                                 Dload  Upload   Total   Spent    Left  Speed
100 15848    0 15848    0     0   708k      0 --:--:-- --:--:-- --:--:--  736k
</message><refDesc>PULL Task 8c4d1a50-3e05-4b58-8d1a-503e057b586d 4_Place_All_Users_In_Inactive</refDesc><refKey>8c4d1a50-3e05-4b58-8d1a-503e057b586d</refKey><status>SUCCESS</status></syncope21:exec><syncope21:exec xmlns:syncope21="http://syncope.apache.org/2.1"><end>2020-01-22T01:13:44.512Z</end><start>2020-01-22T01:13:44.506Z</start><jobType>TASK</jobType><key>40e64a39-47e7-4428-a64a-3947e7c4286b</key><message>Users [created/failures]: 0/0 [updated/failures]: 0/0 [deleted/failures]: 0/0 [no operation/ignored]: 0/0

и я хочу извлечь все между </message> и </start>, например, из приведенного выше, я хочу:

</message><refDesc>PULL Task 8c4d1a50-3e05-4b58-8d1a-503e057b586d 4_Place_All_Users_In_Inactive</refDesc><refKey>8c4d1a50-3e05-4b58-8d1a-503e057b586d</refKey><status>SUCCESS</status></syncope21:exec><syncope21:exec xmlns:syncope21="http://syncope.apache.org/2.1"><end>2020-01-22T01:13:44.512Z</end><start>2020-01-22T01:13:44.506Z</start>

Я пробовал следующее:

curl -X GET ...." | grep xxxxxxx | sed -n -e '/<\/message>/,/<\/start>/p'

но, похоже, он не работает (похоже, он возвращает весь вывод, а не извлекает.

Может кто-нибудь сказать мне, как сделать это?

Спасибо!

Джим

Ответы [ 3 ]

0 голосов
/ 22 января 2020

Можете ли вы попробовать ниже, используя GNU sed:

sed -E -n 's#(^</message>.*</start>).*#\1#p'

, поэтому ваша команда будет выглядеть примерно так:

curl -X GET ...." | grep xxxxxxx | sed -E -n 's#(^</message>.*</start>).*#\1#p'

0 голосов
/ 23 января 2020

Это может работать для вас (GNU sed):

sed '/\n/!{s/<\/message>/\n&/;s/<\/start>/&\n/};/^<\/message>/P;D' file

Если строка еще не была изменена, вставьте новую строку перед </message> и после </start> и напечатайте только эту часть линия.

0 голосов
/ 22 января 2020

awk решения: Не могли бы вы попробовать следующее, если данные присутствуют во входном файле.

awk 'match($0,/<\/message>.*<start>/){print substr($0,RSTART,RLENGTH)}' Input_file

ИЛИ с curl используйте его как:

curl -X GET ...." | awk '{gsub(/\r/,"")} match($0,/<\/message>.*<start>/){print substr($0,RSTART,RLENGTH)}'


sed решения: ИЛИ с GNU sed -z опция:

sed -z 's/.*\(<\/message>.*<start>\).*/\1\n/' Input_file

с curl + sed:

curl -X GET ...." | sed -z 's/\r//g;s/.*\(<\/message>.*<start>\).*/\1\n/'

С показано Пример вывода будет следующим:

</message><refDesc>PULL Task 8c4d1a50-3e05-4b58-8d1a-503e057b586d 4_Place_All_Users_In_Inactive</refDesc><refKey>8c4d1a50-3e05-4b58-8d1a-503e057b586d</refKey><status>SUCCESS</status></syncope21:exec><syncope21:exec xmlns:syncope21="http://syncope.apache.org/2.1"><end>2020-01-22T01:13:44.512Z</end><start>

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