You need to search and replace (parse) a line of code in a file with sed
and know if sed
actually made any changes
sed
can save its output to a backup file if you append the file extension to the -i
option. You can then used cmp
silently to check if the files have changed. cmp
checks the bytes of the files so the comparison is not processor intensive. Finally just remove the backup file and there is no mess left behind.
Simple in place replacement in the file
myfile.txt
and confirm if changes were made
'sed -i.bak '/TEXT_TO_BE_REPLACED/c\This is the next text.' myfile.txt
if cmp -s "myfile.txt" "myfile.txt.bak"; then
echo "$myfile.txt did not change"
else
echo "myfile.txt changed"
fi
rm "myfile.txt.bak"
Replace a line of code with new code in the file
myfile.txt
and confirm if changes were made. The new code is stored in a variable, beware of quote usage here. Note that the code to be replaced must have all special characters escaped, for example$
becomes\$
. For the sake of berevity we will store the file we are trying to parse in the variable$file
file="myfile.txt"
new_code='tools_dir=$(dirname -- "$(readlink -f -- "${BASH_SOURCE[0]}")")/.glstools'
sed -i.bak "/^tools_dir=\$(dirname/c $new_code" "$file"
if cmp -s "$file" "$file.bak"; then
echo "$file did not change"
else
echo "$file changed"
fi
rm "$file.bak"