Замените Sed между двумя строками специальным символом

У меня есть XML-файл, содержащий код, и для использования его с xmllink мне нужно удалить ссылку.

XML-файл, содержащий:

<xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PackingList xmlns="Link to somewhere#">
<morecode></morecode>

Используя sed 'sed s/PackingList.*\>/PackingList/g' xmlfile дает мне следующий результат (на 2-й строке):

<PackingList#">

в то время как это должно быть

<PackingList>

Что я делаю неправильно?

2 ответа

Три вещи неправильно:-

  • Первая цитата в sed Команда должна быть до s/ вариант, не раньше sed сам по себе - я предполагаю, что это опечатка.
  • > символ не имеет специального значения в регулярных выражениях и не должен быть экранирован - последовательность \> имеет особое значение: это означает конец слова, и потому что .* является "жадным", оно соответствует концу последнего слова в строке, следовательно, сохранение #",
  • Если вы соответствуете источника >это будет включено в заменяемую строку, поэтому оно также должно появиться в замещающей строке.

Итак, ваша команда редактирования должна быть:

sed 's/PackingList.*>/PackingList>/g' xmlfile

Это похоже на решение jherran, но учитывает вашу первоначальную попытку сопоставления. Это может быть лучше, чтобы соответствовать до двойной двойной кавычки:

sed 's/PackingList.*"/PackingList/g' xmlfile

Если вы не хотите полагаться на жадность (и сделать ее более читабельной), используйте:

sed 's/PackingList.*".*"/PackingList/g' xmlfile

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

sed 's/PackingList[^>]*"[^>]*"/PackingList/g' xmlfile

Попробуйте так:

sed 's/PackingList.*/PackingList>/g' xmlfile
Другие вопросы по тегам