Sed витягують всі сірники на одній лінії


0

У мене є такий рядок:

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

Відповіді:


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'

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.