ломая линию используя sed. несоответствие или я сделал кардинальную ошибку - PullRequest
0 голосов
/ 22 октября 2019

РЕДАКТИРОВАТЬ Этот билет НЕ предназначен для анализа XML. Пожалуйста, прочитайте вопрос, прежде чем прыгать на лошадей. Заранее спасибо.

Вызов curl отправляет мне обратно текст (в данном примере xml) в одну строку. Для удобства чтения я конвертирую его в оболочку для своих собственных целей, чтобы она разбивала строку в начале каждого узла:

cat xml | sed 's/</\n</g'

Работает довольно хорошо:

$ echo "<div><b>test</b><b>an other text</b></div>" | sed 's/</\n</g'

<div>
<b>test
</b>
<b>an other text
</b>
</div>

Однако яхотел бы разбить строку после > и только в закрывающем теге. Я создал это sed выражение, которое выглядит довольно неплохо:

$ echo "<div><b>test</b><b>an other text</b></div>" | sed -E 's/<\/(.?)>/<\/\1>\n/g'
<div><b>test</b>
<b>an other text</b>
</div>

однако оно не работает на этом:

$ echo "<file><atime>1559521691000</atime><id>CE0E7BAD4FD4409B2AFBC7895482C296896BF947</id><ctime>1470853372000</ctime><factor>290204195029359</factor></file>" | sed -E 's/<\/(.?)>/<\/\1>\n/g'
<file><atime>1559521691000</atime><id>CE0E7BAD4FD4409B2AFBC7895482C296896BF947</id><ctime>1470853372000</ctime><factor>290204195029359</factor></file>

Есть идеи почему?!

Я не вижу причин, по которым это может быть отклонено. Я не вижу никакой общей разницы между этим и предыдущим. Мне приятно слышать, что у sed нет возможности сделать это, но я хотел бы знать, почему это работает для этого первого примера, а не для второго.

Любая хорошая душа, которая могла бы просветить меня? У меня есть своя собственная программа, которая делает это для меня, но я хочу выполнить эту команду на производственных серверах, где я могу писать только сценарии.

1 Ответ

1 голос
/ 22 октября 2019

Шаблон поиска <\/(.?)> соответствует либо </>, либо </X>, где X - любой символ. То есть закрывающий тег с пустым именем или именем из одной буквы.

В первом примере (где он «работает») вы видите разрывы после </b>, которые соответствуют этому шаблону.

Во втором примере нет закрывающего тега с пустыми или однобуквенными именами. Вам нужно будет настроить шаблон. Рассмотрим для примера: <\/([^>]*)>

...