Esto es principalmente fuera de tema, pero podría usar
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
El principal beneficio aquí (más ... xargs ... -I {} ... sed ...
) es la velocidad: evitas invocar sed
10 millones de veces. Sería aún más rápido si pudieras evitar usar Python (ya que Python es un poco lento, relativamente), por lo que Perl podría ser una mejor opción para esta tarea. No estoy seguro de cómo hacer el equivalente convenientemente con Perl.
La forma en que esto funciona es que xargs
invocará a Python con tantos argumentos como pueda caber en una sola línea de comando, y seguirá haciéndolo hasta que se quede sin argumentos (que están siendo suministrados por ls -f *.txt
). El número de argumentos para cada invocación dependerá de la longitud de los nombres de archivo y, um, algunas otras cosas. La fileinput.input
función produce líneas sucesivas de los archivos nombrados en los argumentos de cada invocación, y la inplace
opción le dice que "atrape" mágicamente la salida y la use para reemplazar cada línea.
Tenga en cuenta que el replace
método de cadena de Python no usa expresiones regulares; si los necesita, debe import re
usarlos print re.sub(line, "blah", "blee")
. Son RegExps compatibles con Perl, que son una especie de versiones fuertemente fortificadas de las que obtienes sed -r
.
editar
Como akira menciona en los comentarios, la versión original que usa un glob ( ls -f *.txt
) en lugar del find
comando no funcionaría porque los globos son procesados por el propio shell ( bash
). Esto significa que incluso antes de ejecutar el comando, se sustituirán 10 millones de nombres de archivo en la línea de comando. Esto está prácticamente garantizado para superar el tamaño máximo de la lista de argumentos de un comando. Puede utilizar xargs --show-limits
para obtener información específica del sistema sobre esto.
También se tiene en cuenta el tamaño máximo de la lista de argumentos xargs
, lo que limita el número de argumentos que pasa a cada invocación de python de acuerdo con ese límite. Dado xargs
que todavía tendrá que invocar Python varias veces, la sugerencia de Akira para usar os.path.walk
para obtener la lista de archivos probablemente le ahorrará algo de tiempo.
sed
cada archivo. No estoy seguro de si hay una manera de abrir, editar, guardar y cerrar una serie de archivossed
; Si la velocidad es esencial, es posible que desee utilizar un programa diferente, tal vez Perl o Python.