Замена всего `&`, но не единственного в XML-сущности `& amp;` с `#` с sed в заданном теге XML

Мне нужно было заменить все & # , внутри и внутри <faultstring> ... </faultstring> . Кроме того, & in &amp; не следует изменять. Пример ввода:

 123&&<faultcode>IBM.Error<faultstring>special character & and one converted &amp;</faultstring></faultcode>&&123 

Ожидаемый результат:

 123&&<faultcode>IBM.Error<faultstring>special character # and one converted &amp;</faultstring></faultcode>&&123 

Следующий работает с границей, но также заменяет &amp; с #amp;

 sed -e :1 -e 's@\(<faultstring>.*\)&\(.*</faultstring>\)@\1#\2@;t1' 

Кроме того, я заменяю эти шаблоны inplace файлом.

PS: Я создал новый вопрос, чтобы избежать путаницы в моем предыдущем потоке . Если вы, ребята, обнаружили, что это может быть объединено в предыдущем потоке, пожалуйста, сделайте это. Я просто надеюсь, что новый поток привлечет людей, чтобы быстро ответить, и свести к минимуму путаницу.

  • Преобразование / импорт плоского файла с несколькими записями, по одной переменной на строку
  • Как добавить строку, которая не начинается с '<' до предыдущей строки
  • половину числовых полей выше 10000, падение десятичных знаков
  • Проверка списка файлов xml
  • Как добавить тег для xml из файла, существует с помощью оболочки linux
  • Считается ли хорошей практикой использование тега nxml в файлах xml conf?
  • Разбирайте XML, чтобы получить значение узла в скрипте bash?
  • создать файл XML с помощью сценария bash
  • One Solution collect form web for “Замена всего `&`, но не единственного в XML-сущности `& amp;` с `#` с sed в заданном теге XML”

    Это сработало для меня:

     sed -e :1 -e 's@\(<faultstring>.*\)&\([^amp;]\)\(.*</faultstring>\)@\1#\2\3@;t1' file 

    Чтобы заменить его на &amp; использовать это:

     sed -e :1 -e 's@\(<faultstring>.*\)&\([^amp;]\)\(.*</faultstring>\)@\1\&amp;\2\3@;t1' file 
    Linux и Unix - лучшая ОС в мире.