Поиск и замена символа в XML-файле с помощью команды sed не работает

Поиск и замена символа в XML-файле с помощью команды sed не работает

У меня есть XML-файл с именем myfile.xml

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&Welcome</c>
   </b>
   <d>Hello & How are you?</d>
</a>

Я хочу эту трансформацию.

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello &amp; How are you?</d>
</a>

Я использую команду sed следующим образом, чтобы изменить все вхождения & на &

sed -i 's:&:&amp;:' myfile.xml

но я получаю ошибку `undefined label 'yfile.xml'. Я не могу продолжить. Как это сделать?

решение1

Если у вас нетGNU sed, sedнужен параметр для-i

sed -i.bak 's:&:&amp;:' myfile.xml

и резервный файл — это хорошая идея или…

…используйте Perl;)

Тест с

perl -pe 's/&/&amp;/' myfile.xml

и сделатьредактирование на местес

perl -pi -e 's/&/&amp;/' myfile.xml

Но только один раз.

После команды myfile.xmlсодержимое

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello &amp; How are you?</d>
</a>

решение2

Вам нужно сбежать и из-за особого персонажа. И вам нужно два прохода, чтобы завершить его.

Использование:
1. sed 's|Hi\&|Hi\&amp;|g' yourfile.xmlЭто произведет:

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello & How are you?</d>
</a>
  1. Второй проход будет: sed 's|Hello\ \&| \Hello\ \&amp;|g' test.xml. Производит:

    <!--This is an xml document for test-->
    <a><!--This is root node-->
       <b>
        <c>Hi&amp;Welcome</c>
       </b>
       <d> Hello &amp; How are you?</d>
    </a>
    

    Конечно, используйте -iпереключатель, чтобы сделать его постоянным.

Еще один продвинутый способ, основанный на комментарии @terdon ниже:

sed -e 's/Hello &/Hello \&amp;/' -e 's/Hi&/Hi\&amp;/' filename.xml

Связанный контент