У меня есть файл со следующими строками:
bash$ cat blah.txt
<smsDeliveryStatus value="Provider Malfunction"/>
<smsDeliveryStatus value="Provider Malfunction" id="23434"/>
<smsDeliveryStatus value="Delivery Failure"/>
<smsDeliveryStatus value="Delivery Successful" id="2"/>
bash$
Я хочу извлечь значение и идентификатор из файла для каждой строки, и там, где значение или идентификатор не существует, я хочу напечатать неизвестное. Я написал следующий код, который иногда дает сбой при установке идентификатора на неизвестное, а иногда он не работает:
bash$ cat blah.txt | sed -nr "/smsDeliveryStatus /{h; /value/ {s/.*value=\"([^\"]*)?\".*/value: \1/}; /value/! {s/.*/value: Unknown/}; p; x; /id/ {s/.*id=\"([^\"]+)\".*/id: \1/g}; /id/! {s/.*/id: Unknown/g}; p}"
Это дает следующий результат из вышеуказанного файла:
value: Provider Malfunction
<smsDeliveryStatus value="Provider Malfunction"/>
value: Provider Malfunction
id: 23434
value: Delivery Failure
id: Unknown
value: Delivery Successful
id: 2
Как ни странно, первая строка с отсутствующим идентификатором выводится полностью, а вторая строка с отсутствующим идентификатором устанавливает идентификатор в неизвестное значение, как и ожидалось. Кто-нибудь может пролить свет на то, почему это происходит? Какая разница между первым разом / id /! читается и второй раз?
A