Un poco tarde para la fiesta pero para el beneficio de los demás, encontré que la bandera 'w' era exactamente lo que estaba buscando.
sed -i "s/$pattern/$new_pattern/w changelog.txt" "$filename"
if [ -s changelog.txt ]; then
# CHANGES MADE, DO SOME STUFF HERE
else
# NO CHANGES MADE, DO SOME OTHER STUFF HERE
fi
changelog.txt
contendrá cada cambio (es decir, el texto modificado) en su propia línea. Si no hubo cambios, changelog.txt
serán cero bytes.
Un recurso sed realmente útil (y donde encontré esta información) es http://www.grymoire.com/Unix/Sed.html.
Esto podría funcionar para usted (GNU sed):
sed -i.bak '/'"$old_pattern"'/{s//'"$new_pattern"'/;h};${x;/./{x;q1};x}' file || echo changed
Explicación:
/'"$old_pattern"'/{s//'"$new_pattern"'/;h}
si el espacio patrón (PS) contiene elold pattern
, reemplácelo por elnew pattern
y copie el PS en el espacio de espera (HS).${x;/./{x;q1};x}
al encontrar la última línea, cambie al HS y pruébelo para detectar la presencia de cualquier cadena. Si se encuentra una cadena en el HS (es decir, se ha realizado una sustitución), vuelva al PS original y salga usando el código de salida de1
, de lo contrario, vuelva al PS original y salga con el código de salida de0
(el predeterminado).
Creo que puede encontrar útiles estas extensiones sed de GNU
t label
If a s/// has done a successful substitution since the last input line
was read and since the last t or T command, then branch to label; if
label is omitted, branch to end of script.
y
q [exit-code]
Immediately quit the sed script without processing any more input, except
that if auto-print is not disabled the current pattern space will be printed.
The exit code argument is a GNU extension.
Parece exactamente lo que estás buscando.
Puede comparar el archivo original con la salida sed para ver si cambió:
sed -i.bak s:$pattern:$new_pattern: "$filename"
if ! diff "$filename" "$filename.bak" &> /dev/null; then
echo "changed"
else
echo "not changed"
fi
rm "$filename.bak"