У меня есть следующий текст в File.XML
:
<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->
Я хотел бы заменить его на
<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>
, который я пробовал:
$ sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>/' File.XML
Но получите эту ошибку:
sed: -e expression #1, char 63: unknown option to `s'
Проблема - то, что Ваш шаблон поиска содержит /
, который Вы используете в качестве заменяющего разделителя, необходимо использовать другой символ для этого или выйти /
:
sed -i 's#<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->#<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>#' File.XML
или
sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs>/' File.XML
Примечание, которое Вы должны никогда регулярные выражения использования для парсинга [X] HTML .
Наконец, как правило, при работе с регулярными выражениями, меньше больше. Необходимо попытаться определить самый простой эксклюзивный шаблон, а не повторить весь текст. Это не только делает Ваш код намного легче читать, он также избегает проблем как та, с которой Вы сталкивались. Например:
sed -i -r 's/<!--(UpdateAccountGUIDs.+?)-->/<\1>/' File.XML
Здесь, эти -r
включает синтаксис расширенного регулярного выражения, таким образом, мы можем использовать ()
для получения группы (не будучи должен выйти из круглых скобок) и затем назвать полученный текст \1
. Так, команда выше просто ищет комментарий, который смежен с UpdateAccountGUIDs
, расширяется до первого конца оператора комментария и затем делает замену.