Intereting Posts
Как найти любую символическую ссылку на сервере? Перенаправить ввод из файла в программу Простаивание процессора велико, но процессы изо всех сил стараются не отставать, как если бы процессор находился под большой нагрузкой Что такое мягкая блокировка процессора? Интернет-маршрутизация между wlan0 и ppp0? Как связать номер строки с файлом в файл результатов выходного файла diff? su vs su – (на Debian): почему PATH то же самое? Прочитайте два текстовых файла, объедините каждую строку Как распечатать все строки, не содержащие строку вместе со смежными строками? Мой сетевой адаптер присутствует, но с помощью команды «lshw» показано, что «устройство не заявлено». Как заявить этот драйвер / устройство? Сколько памяти принтера требуется для каждой страницы? Как начать работу с CentOS? Как продолжить скрипт после закрытия X? службы debian не работают Эффективность пространства ссылок Btrfs по сравнению с жесткими ссылками

Как заменить все вхождения в файле уникальным значением для каждого события

У меня есть один 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