
У меня есть 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&Welcome</c>
</b>
<d>Hello & How are you?</d>
</a>
Я использую команду sed следующим образом, чтобы изменить все вхождения & на &
sed -i 's:&:&:' myfile.xml
но я получаю ошибку `undefined label 'yfile.xml'. Я не могу продолжить. Как это сделать?
решение1
Если у вас нетGNU sed, sed
нужен параметр для-i
sed -i.bak 's:&:&:' myfile.xml
и резервный файл — это хорошая идея или…
…используйте Perl;)
Тест с
perl -pe 's/&/&/' myfile.xml
и сделатьредактирование на местес
perl -pi -e 's/&/&/' myfile.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>
решение2
Вам нужно сбежать и из-за особого персонажа. И вам нужно два прохода, чтобы завершить его.
Использование:
1. sed 's|Hi\&|Hi\&|g' yourfile.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>
Второй проход будет:
sed 's|Hello\ \&| \Hello\ \&|g' test.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>
Конечно, используйте
-i
переключатель, чтобы сделать его постоянным.
Еще один продвинутый способ, основанный на комментарии @terdon ниже:
sed -e 's/Hello &/Hello \&/' -e 's/Hi&/Hi\&/' filename.xml