Якщо ви можете запустити сценарій, ось що я зробив для подібної ситуації:
Використовуючи словник / 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і ґрунтувалося на відповіді Вася Новикова на петлі над кортежами в баш .
sed -i 's/abc/xyz/g' xa*?