У меня есть каталог, полный XML-файлов, которые выглядят следующим образом, для которых я хочу изменить значение элемента «offset» с 1 на какое-то другое число
$ cat my.xml
<offset xmlns="">1</offset>
Я написал различные комбинации этой команды sed, но ни одна из них, которую я пробовал, не запускается без ошибок. Я почти уверен, что мне нужно экранировать некоторые символы, но те, которые я пробовал, всегда заканчиваются ошибками («неожиданный токен», «неизвестная опция» и т. д.). Я также пробовал без флага -e, поскольку это на самом деле не выражение.
sed -i -e s/<offset xmlns="">1</offset>/<offset xmlns="">99</offset>/ *.xml
Любая помощь будет оценена по достоинству.
решение1
Вам не нужно использовать /
sed, вы можете использовать запятую, например:
sed -i 's,<offset xmlns="">1</offset>,NEW_TEXT,' FILE
решение2
Попробуй это,
$ sed 's~<offset xmlns="">1~<offset xmlns="">99~g' file
<offset xmlns="">99</offset>
Используйте другой разделитель sed, если входные данные содержат слеши.
решение3
Обычно вам не нужно все это в s/earch/replace/
самой функции, и вместо этого можно сначала, /address/
затем условно /s///
. Это может не только помочь с читаемостью и избежать некоторых из упомянутых вами проблем, но также может повысить производительность:
sed '/offset xmlns=/s/>1</>99</'
решение4
Я бы заменил 17-й символ строки, содержащий значение:
sed -i 's/^\(.\{17\}\)./\1VALUE/' file.xml
Замените ЗНАЧЕНИЕ новым значением для <offset>
. Например.
sed -i 's/^\(.\{17\}\)./\18/' file.xml
чтобы изменить его на 8.