У меня есть 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 'ошибка. Я не могу продолжить. Как это сделать?
Если у Вас нет 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>
Необходимо выйти из & из-за специального символа. И Вам нужны две передачи для завершения его.
Использование:
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
переключатель для создания этого permenant.
Другой усовершенствованный путь на основе комментария @terdon ниже:
sed -e 's/Hello &/Hello \&/' -e 's/Hi&/Hi\&/' filename.xml