Если вы можете запустить скрипт, вот что я сделал для аналогичной ситуации:
Используя словарь / hashMap (ассоциативный массив) и переменные для sed
команды, мы можем перебрать массив, чтобы заменить несколько строк. Включение в шаблон подстановочного знака name_pattern
позволит заменить на месте файлы с шаблоном (это может быть что-то вроде name_pattern='File*.txt'
) в определенном каталоге ( source_dir
). Все изменения написаны logfile
вdestin_dir
#!/bin/bash
source_dir=source_path
destin_dir=destin_path
logfile='sedOutput.txt'
name_pattern='File.txt'
echo "--Begin $(date)--" | tee -a $destin_dir/$logfile
echo "Source_DIR=$source_dir destin_DIR=$destin_dir "
declare -A pairs=(
['WHAT1']='FOR1'
['OTHER_string_to replace']='string replaced'
)
for i in "${!pairs[@]}"; do
j=${pairs[$i]}
echo "[$i]=$j"
replace_what=$i
replace_for=$j
echo " "
echo "Replace: $replace_what for: $replace_for"
find $source_dir -name $name_pattern | xargs sed -i "s/$replace_what/$replace_for/g"
find $source_dir -name $name_pattern | xargs -I{} grep -n "$replace_for" {} /dev/null | tee -a $destin_dir/$logfile
done
echo " "
echo "----End $(date)---" | tee -a $destin_dir/$logfile
Сначала объявляется массив пар, каждая пара является строкой замены, затем WHAT1
будет заменена на FOR1
и OTHER_string_to replace
будет заменена на string replaced
в файле File.txt
. В цикле считывается массив, первый член пары извлекается как, replace_what=$i
а второй как replace_for=$j
. Команда find
ищет в каталоге имя файла (которое может содержать подстановочный знак), и sed -i
команда заменяет те же файлы, которые были определены ранее. Наконец я добавилgrep
перенаправление в файл журнала, чтобы записать изменения, внесенные в файл (ы).
Это сработало для меня GNU Bash 4.3
sed 4.2.2
и основано на ответе VasyaNovikov для Loop over tuples in bash .
sed -i 's/abc/xyz/g' xa*
?