Использование sed со специальными символами

Использование sed со специальными символами

У меня есть каталог, полный 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.

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