Якщо ви можете запустити сценарій, ось що я зробив для подібної ситуації:
Використовуючи словник / 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*
?