¿Cómo editar múltiples archivos de texto con un solo comando?

18

Quiero eliminar la primera línea de múltiples archivos de texto y reemplazarla por otra línea. ¿Hay alguna manera de hacer esto usando la terminal?

Sé cómo usar vim, ¿hay alguna manera de automatizarlo con él? Quiero evitar hacerlo manualmente (como en la edición de cada archivo individualmente).

De ser posible, me gustaría evitar la instalación de nuevas bibliotecas (especialmente para algo así que considero muy simple, pero podría estar equivocado).

¡Gracias de antemano!

    
pregunta TomTsagk 01.08.2015 - 22:47

7 respuestas

20

Puedes usar sed :

sed -i.bak '1s/^.*$/new line/' *.txt

Esto reemplazará la primera línea de todos los archivos .txt en el directorio actual con el texto new line , cámbialo para satisfacer tus necesidades.

También se realizarán copias de seguridad de los archivos originales con la extensión .bak , si no lo desea, simplemente utilice:

sed -i '1s/^.*$/new line/' *.txt
    
respondido por el heemayl 01.08.2015 - 22:57
11

Bueno, usando vim en sí:

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

Qué hace esto:

  • setline (n, text) , bueno, es una función que establece la línea n a text .
  • call es necesario para llamar a funciones.
  • bufdo se usa para repetir un comando a través de los búferes (sin un rango, actúa en todos los buffers ).
  • wq guarda y sale del buffer. Necesitamos hacer esto antes de pasar al siguiente buffer, por lo que este comando está encadenado al comando call usando | .
  • -c cmd runs cmd es un comando en modo comando después de cargar el primer buffer.
  • Nes activa no compatible, silencioso, ex-modo, que es mejor para el procesamiento no interactivo.

Beneficios:

  • El contenido de texto setline puede ser cualquier cosa, un & en un texto de reemplazo sed puede tener efectos no deseados.
respondido por el muru 01.08.2015 - 23:16
3

Algunas otras opciones:

  • awk (necesita una versión relativamente nueva de GNU awk )

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Perl / shell

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • Shell / coreutils

    $ for f in *txt; do 
        ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; 
      done
    
respondido por el terdon 02.08.2015 - 08:18
2

Este script hará lo que usted solicite, colocando los archivos modificados en un nuevo directorio sin cambiar los originales.

d=/tmp/cooked
mkdir $d
for f in *  #will match all files in current directory; adjust as desired
do
  echo "This is the new 1st line" > /${d}/${f}
  sed 1d ${f} >> /${d}/${f}
done
    
respondido por el Charles Boling 01.08.2015 - 23:04
0

Usar gawk

gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

Ejemplo

% cat foo.txt 
1
2
3
4

% cat bar.txt 
1
2
3
4

% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt                                                    
your_replacement
2
3
4

% cat bar.txt                                                    
your_replacement
2
3
4
    
respondido por el A.B. 02.08.2015 - 09:30
0

jEdit: Lo uso para mass-find-and-replace. Es poderoso con la capacidad de usar RegEx - Expresiones regulares. Puede operar en archivos dentro de un directorio, especificar extensiones de archivo, por ejemplo, ".html", etc. Y, puede ver la configuración regional del cambio candidato en contexto, en una GUI. jEdit es genial.

jEdit está disponible en el centro de software de Ubuntu.

    
respondido por el Roger 10.08.2015 - 20:02
0

Los comandos tail y cat harían esto fácilmente:

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

Envuelva esos en un bucle adecuado y tal vez use un archivo temporal adecuado y justo en lugar de un nombre de archivo temporal codificado. Creo que bash y otras shells tienen una sintaxis para crear archivos temporales.

La opción -n de cola tiene dos interpretaciones según si el argumento tiene un signo más. Si tiene un signo más, significa mostrar la cola del archivo comenzando en el número de línea dado. De lo contrario, el número es el número de líneas, incluida la última línea, que se supone que se generará.

    
respondido por el cardiff space man 03.09.2015 - 17:55

Lea otras preguntas en las etiquetas