У меня есть один xml-файл, который имеет несколько вхождений MyID, как показано ниже.
MyID="dett090900990000"
Я хочу заменить все вхождения значения MyID=""
уникальным значением.
Например, если у меня есть три вхождения MyID=""
в xml-файле, когда я буду запускать скрипт, я передам один аргумент, который будет использоваться как значение MyID (но для каждого вхождения будет добавлено инкрементное значение).
т.е. когда я запустил свой скрипт как myscript.sh 7777777878889888
Вывод должен быть таким, как показано ниже (это означает, что все значение для MyID будет изменено и теперь будет иметь уникальные значения). Это может быть что угодно (число, строка и смешанное).
MyID="77777778788898881"
MyID="77777778788898882"
MyID="77777778788898883"
Как вы можете видеть, 1, 2 и 3 будут добавлены к предоставленному значению.
Я ищу простую команду для решения этой проблемы! Спасибо!
В Perl это можно сделать следующим образом:
perl -pe 'BEGIN { $v=shift; } s/(MyID=")[^"]*(")/$1.$v.++$t.$2/ge' 7777777878889888 foo.xml bar.xml
Это не совсем просто, но это работает. Сценарий принимает два аргумента, Arg1 – это строка, которая соответствует, Arg2 – имя файла входного файла. Это решение использует awk вместо sed.
#!/bin/bash # myscript.sh # Usage myscript.sh <string to match> <filename> MyID=$1 awk -v MyID=$MyID 'BEGIN{ mynum=1; } { if (match($0,MyID) ) { sub(MyID, sprintf("%s%d", MyID, mynum) ) mynum++; } print }' $2