Если вы можете запустить скрипт, вот что я сделал для аналогичной ситуации:
Используя словарь / 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*?