Puedes usar find
y -exec
directamente en sed
en lugar de localizar primero oldstr
con grep
. Es quizás un poco menos eficiente, pero eso podría no ser importante. De esta forma, el sed
el reemplazo se ejecuta sobre todos los archivos enumerados por find
, pero si oldstr
no está allí, obviamente no funcionará en él.
find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;
Tu solución está bien. solo inténtalo de esta manera:
files=$(grep -rl oldstr path) && echo $files | xargs sed....
así que ejecuta el xargs
solo cuando grep devuelve 0
, p.ej. cuando se encuentra la cadena en algunos archivos.
Tomé la idea de Vlad y la cambié un poco. En lugar de
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
Que produce
sed: couldn't edit /dev/null: not a regular file
Estoy haciendo en 3 conexiones diferentes al servidor remoto
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
Aunque esto es menos elegante y requiere 2 conexiones más al servidor (tal vez haya una forma de hacerlo todo en una sola línea), también hace el trabajo de manera eficiente