У меня есть несколько файлов конфигурации с настраиваемыми данными внутри них. Пример (смотрите на ${ConnectorPort}
):Как использовать скрипт bash для замены ключей значениями в файлах с помощью файла свойств в качестве входа
<Connector port="${ConnectorPort}" protocol="HTTP/1.1" server="MyServer"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
Со временем конфигурации, я хотел бы заменить ключи со значениями из заданного файла свойств.
Проблема заключается в том, что требуется длительное время (несколько секунд в файле), чтобы перебирать все файлы и перебирать все свойства, чтобы проверить на замену для каждого свойства. Скрипт ниже.
Любая идея, как это сделать быстрее, используя bash?
Возможно, есть способ в sed или awk, чтобы получить все свойства как один вход?
Возможно, замена в памяти?
Сценарий:
for file in "${files[@]}"
do
# echo ------
#echo In file: $file
#echo ------
cp -f "$file" "$file.bak"
unset replaced
for prop in "${!props[@]}"
do
key="$prop"
keyToReplace="\${$prop}"
val="${props[$key]}"
# echo In prop: $key=$val
sed -i "s|$keyToReplace|$val|Igw $file.change" "$file"
assertReturnStatus $? "sed failed"
if [ -z "$replaced" ] && [ -s "$file.change" ]; then
replaced=true
echo Replacing props in file "$file"
cp -n "$file.bak" "$file.orig"
fi
done
rm -f "$file.change"
rm -f "$file.bak"
done
* Одним из требований является создание резервной копии (.orig), если файл был изменен.
Спасибо.
Рассмотрите возможность использования XML-парсер, как xmllint – anubhava
@anubhava - Я предпочитаю, чтобы держать ключи/значения, просто, как я могу. Следовательно, файл свойств. –
О, и файлы конфигурации, которые нужно заменить, могут быть любыми: от XML до JSON. –