Я хочу автоматизировать процесс, в котором часть имени файла используется для замены значения в самом файле.
Сейчас я использую ручной процесс, который выглядит следующим образом:
получаю orgname вручную
$ grep -o orgname......... *2017-04* |uniq
...
uname=123456&**orgname=ABC5678**&userType=PERSISTENT&userLoginName=someusername&eventType=FAILED_LOGIN_ATTEMPT&timeOfOccurrence=2017-03-12%2016%3A49%3A36
Затем заменяю orgname новым именем
$ sed -i 's/ABC1234/5678/g' `*`5678`*` ; sed -i 's/DEF2345/6789/g' `*`6789`*`; sed -i etc...
Конечный результат выглядит следующим образом:
uname=123456&orgname=**1234**&userType=PERSISTENT&userLoginName=someusername&eventType=FAILED_LOGIN_ATTEMPT&timeOfOccurrence=2017-03-12%2016%3A49%3A36
The files are named like this:
rsa.collect.rsa-IB_L**1234**-2017-03-12.log.web1.decrypt
Все, что находится после orgname=, должно измениться с ABC5678 на все, что идет после Lxxxx, только в файлах с тем же xxxx в имени файла.
Мне трудно понять, как извлечь это число из имени файла и использовать его в sed
. Есть сотни файлов (каждый со своей датой) и 6 различных пар чисел, с которыми нужно работать. Я надеюсь написать сценарий bash, который сделает все это за один раз.
Я пытался использовать grep -P
в сочетании с занесением в какую-то переменную и использованием sed
, но, возможно, есть лучший/простой способ?
Дайте мне знать, если есть дополнительные вопросы.
После того как имя файла находится в переменной, вы можете использовать оператор оболочки расширения параметра, чтобы извлечь его часть. Затем подставьте это в команду sed
. Ниже я использую оператор подстроки, чтобы получить 4 символа, начиная с позиции 20.
for file in rsa.collect.rsa-IB_L*.log.web1.decrypt; do
orgname=${file:20:4}
sed -i "s/orgname=[^&]*/orgname=$orgname/" "$file"
done