Как определить список строк и заменить каждый экземпляр строки в файлах в подкаталоге? - PullRequest
0 голосов
/ 09 марта 2020

input

Скажем, у меня есть три файла в подкаталоге / directory /: a.txt , b.txt и c .txt .

a.txt
var1=bla
var2=blabla
var3=blablabla

b.txt
foo1=bar
foo2=barbar
foo3=barbarbar

c.txt
name1=string
name2=string2
name3=string3

Я создал 4-й файл, variables.txt

variables.txt
var2=new
foo1=newnew
foo3=newnewnew

желаемый вывод

Я бы хотел bash script , использующий содержимое variables.txt для редактирования всех файлов в / directory /, заменяя любые файлы соответствующими переменными из variables.txt. Например, a.txt , b.txt и c .txt становятся следующими:

a.txt
var1=bla
var2=new
var3=blablabla

b.txt
foo1=newnew
foo2=barbar
foo3=newnewnew

c.txt
name1=string
name2=string2
name3=string3

c .txt не изменяется, так как ничто в variable.txt не соответствует его переменным.

Как бы выглядел этот скрипт?

context

В действительности У меня есть около 20 файлов с 5-20 переменными в каждом, и мне нужно изменить, может быть 3-4 переменных в каждом файле. Другие пользователи также будут использовать variables.txt, определяя его в соответствии со своими целями, поэтому, чем чище я могу написать variables.txt, тем лучше. К счастью, каждая переменная имеет уникальное имя и появляется только один раз в файле из этого подкаталога. Спасибо!

1 Ответ

1 голос
/ 09 марта 2020

Использование awk и расширения inplace:

awk -F= --include inplace '
  NR==FNR{a[$1]=$2;next}
  ($1 in a){$2=a[$1]}
  1' variable.txt /directory/[abc].txt

Этот скрипт заполняет массив a содержимым файла variable.txt.

Для каждого другого файла он заменяет значение, если параметр является частью массива.

Параметр --include inplace позволяет изменять файлы напрямую (без создания временного файла), что аналогично параметру sed -i.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...