Замените 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