У меня есть следующая строка:

randomtext<News:Image>111</News:Image>morerandomtext<News:Image>abc123</News:Image>sometext<News:Image>321abc</News:Image>

Я не могу сделать sed, чтобы извлечь значения между тегами <News:Image> и </News:Image> .

Я попытался с помощью sed -rn 's/<News:Image>/<\/News:Image>/p' feed2.xml и не смог заставить его работать.

Мне нужен sed для вывода:

111

abc123

321abc

1 ответ1

0

Ваша строка sed преобразует <News:Image> в </News:Image> , что не то, что вам нужно.

Если предположить, что ни один из текстов не содержит < то следующая простая и простая замена:

sed -n 's/[^<]*<News:Image>\([^<]*\)<\/News:Image>[^<]*/\1\n/gp' feed2.xml

Он находит любой текст до и после нужного тега, а затем заменяет найденную строку на то, что находится между открывающим и закрывающим тегами, с добавлением новой строки.

В более общем случае, например, когда в одной строке могут быть разные теги, это проще всего сделать с помощью двух вызовов sed :

sed -e 's/<News:Image>/\n&/g' -e 's/<\/News:Image>/&\n/g' feed2.xml | \
    sed -n 's/[^<]*<News:Image>\(.*\)<\/News:Image>/\1/gp'

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .