–Juan Gabriel Covas 2015
Busca “key=value” en el archivo especificado y añade la línea si no existe o sustituye el valor si ya existe
Función change_conf para BASH
#######################################################################################################################
# Custom Function to search/replace/add a "key=value" pair on a given .conf file.
# Supports line commented with #key...
# Supports key=value in form of "key = value" which is good for sysctl.conf, etc. since the search is done for
# "key" and then replaced/added
change_conf() {
if [[ $# -ne 3 ]]; then
echo "ERROR: change_conf function. Expected parameters: 3"
echo "Example: change_conf /etc/file.conf key value"
exit 1
else
sr_file="$1"
basename_sr_file=$(basename $1)
sr_key="$2"
sr_value="$3"
replacement="${sr_key}=${sr_value}"
# for i in "$@"; do echo $i ; done
# create the file if not found
if [ ! -f "$sr_file" ] ;then
echo "Created new file: ${sr_file}";
touch ${sr_file};
printf '%s' ${sr_file}
else
# start by printing the file to be changed
printf '%s' ${sr_file}
bCommented=0
grep -q -E "^#${sr_key}\s=" ${sr_file} && bCommented=1;
if [ $bCommented -eq 0 ] ;then
grep -q -E "^#${sr_key}=" ${sr_file} && bCommented=1;
fi
if [ $bCommented -eq 1 ] ;then
sed -i "s/#${sr_key} =/${sr_key} =/w /tmp/mychglog.txt" ${sr_file}
if [ ! -s /tmp/mychglog.txt ] ;then
sed -i "s/#${sr_key}=/${sr_key}=/w /tmp/mychglog.txt" ${sr_file}
fi
printf " ---> Removed # "
fi
fi
bFound=0
cur_value=""
grep -q -E "^${sr_key}=" ${sr_file} && bFound=1; cur_value=$(grep -E "^${sr_key}=" ${sr_file})
if [ $bFound -eq 0 ] ;then
grep -q -E "^${sr_key} =" ${sr_file} && bFound=2; cur_value=$(grep -E "^${sr_key} =" ${sr_file})
search_str="^${sr_key} =";
else
search_str="^${sr_key}=";
fi
# tell what will be done for this key/value pair
if [ ! -z "${cur_value}" ] ;then
IFS='=' read -ra value_parts <<< "$cur_value"
# we will try to change or add, only if value is different
# printf ' - Testing [%s] Vs. [%s] - ' "${replacement}" "${cur_value}"
if [[ "${replacement}" == "${cur_value}" ]]; then
printf ' ------> SKIP [%s] [%s]\n' "${sr_key}" "${value_parts[1]}"
return 0
fi
printf ' ---> REPLACE [%s] to [%s] ... ' "${cur_value}" "${replacement}"
else
printf ' -------> ADD [%s] [%s] ... ' "${sr_key}" "${sr_value}"
fi
# do the search/replace/add
sudo awk -v replacement="${replacement}" \
-v search="${search_str}" \
'match($0, search) {print replacement; found=1} !match($0, search) {print $0} END {if (!found) {print replacement }}' \
${sr_file} > /tmp/tmp-${basename_sr_file}
# cat /tmp/tmp-${sr_file}
cat /tmp/tmp-${basename_sr_file} | sudo tee ${sr_file} >/dev/null
# check the resulting file
grep -q -e "^${replacement}" $sr_file
RETVAL=$?
[ $RETVAL -eq 0 ] && printf 'OK.\n'; return 0
[ $RETVAL -ne 0 ] && printf 'FAILED!\n'; return 1
fi
}