Usando ed para manipular archivos coincidentes por el hallazgo
-
25-09-2019 - |
Pregunta
Tras la Bash-hackers de wiki recomendación , quiero editar archivos usando ed.
En particular, quiero hacer lo siguiente con Ed en lugar de sed:
find . -type f -exec sed -i -e 's/a/b/g' {} \;
veo que Ed no tiene opt como -e de sed, por lo que yo sé, tuberías y redirecciones io son la única manera de trabajar con él de forma no interactiva.
Por lo tanto, el uso de la D desde un script bash para hacer lo mismo que el anterior comando sed se vería así:
ed file_name <<<$'g/a/s//b/g\nw'
o
echo $'g/a/s//b/g\nw' | ed file_name
Pero por lo que sé que es imposible incluir tuberías o redirecciones io dentro del hallazgo -exec.
Do Me he perdido algo? o es la única manera de superar esto es a los bucles de uso?
for file in $(find . -type f -print); do ed $file <<<$'g/a/s//b/g\nw'; done;
Solución
find . -type f -exec bash -c 'ed -s "$2" <<< "$1"' _ $'g/a/s//b/g\nw' {} \;
Y una versión POSIX:
find . -type f -exec sh -c 'printf "%s\n" "g/a/s//b/g" w | ed -s "$1"' _ {} \;
La razón principal para el uso de urgencias en detrimento sed -i es que los archivos ediciones ed mientras sed -i archivos sobreescribe, y eso es un problema si le sucede que tiene enlaces que no desea romper.
Otros consejos
Este hallazgo & Ed fragmento cuenta con un modo de prueba (para que pueda verificar que tienes a la derecha de expresiones regulares antes de una masa acutal operación de reemplazo):
Buscar y reemplazar con find & Ed
Ponga el comando ed con todos los cambios de dirección y "aquí documentos" en un script de shell, e invocar que a partir hallazgo.
Pero tengo que preguntar: ¿por qué ed? ¿Qué te parece que puede hacer con Ed que no se puede ver con sed?