Corríjame si he entendido mal su pregunta, pero por su descripción, supongo que tiene un .txt
documento Ascii único (posiblemente muy grande) y que cuando dice que los cambios deben aplicarse "en orden", quiere decir que ' me gustaría hacer la primera búsqueda / reemplazo en todo el documento, luego la segunda búsqueda / reemplazo en todo el documento y así sucesivamente.
Quizás la solución más fácil sería crear un archivo (llamarlo sedscript
) que contenga un sed
script, una línea por cambio. Aquí hay un ejemplo. Al g
final significa "global", es decir, reemplazar todas las ocurrencias, no solo la primera ocurrencia en cualquier línea dada.
s/foo/bar/g
s/hello/world/g
s/yellow/green/g
:
Luego puede ejecutar esto de la siguiente manera:
sed -f sedscript infile.txt > outfile.txt
Si está satisfecho con la salida, simplemente mv
vuelva a colocarla sobre la parte superior de la entrada:
mv outfile.txt infile.txt
Si estás en una máquina Linux, eso viene con sed
. Si está en Windows, puede obtener sed
(y mv
) con Cygwin o mi propio shell Hamilton C (incluida la versión gratuita ).
Adicional:
Dado que también le gustaría considerar coincidencias que abarquen los extremos de la línea, entonces, sí, una forma de hacerlo es reemplazar todos los extremos de la línea con un carácter especial o cadena, realice las operaciones de búsqueda / reemplazo que desea y luego coloque los extremos de la línea cuando hayas terminado.
La forma más fácil de hacer las conversiones de final de línea sed
es en etapas de canalización separadas. En mi ejemplo aquí, he reemplazado las \r\n
secuencias con un #
pero podría ser una cadena completamente arbitraria (pero es más fácil si puede usar un solo carácter).
sed 's/\r\n/#/' infile.txt | s -f sedscript | sed 's/#/\r\n/g' > outfile.txt
Dentro de su sedscript
archivo, buscaría / reemplazaría en ambas variaciones, con un espacio entre las palabras o lo que sea que lo haya reemplazado.
Si puede usar un solo carácter y no necesita una cadena de caracteres múltiples para garantizar la unicidad, puede usar la \(...\)
notación para crear una expresión regular etiquetada alrededor de la [...]
lista de caracteres que pueden separar una palabra. Lo que coincida se puede insertar en la cadena de reemplazo como \1
.
Aquí hay una captura de pantalla de cómo podría funcionar esto.