2010-03-25 35 views
8

dado un documento de texto con varias líneas como:Añadir al final de la línea con sed

c48 7.587 7.39 
c49 7.508 7.345983 
c50 5.8 7.543 
c51 8.37454546 7.34 

tengo que añadir algo de información 2 espacios después del final de la línea, por lo que para cada línea que lo haría consiga:

c48 7.587 7.39 def 
c49 7.508 7.345983 def 
c50 5.8 7.543 def 
c51 8.37454546 7.34 def 

Necesito hacer esto para miles de archivos. Supongo que esto es posible con sed, pero no sé cómo hacerlo. ¿Alguna pista? ¿Podría también darme algún enlace con un tutorial o una tabla para este caso?

Gracias

Respuesta

14

si todos sus archivos están en un directorio

sed -i.bak 's/$/ def/' *.txt 

lo hagan recursiva (GNU encontrar)

find /path -type f -iname '*.txt' -exec sed -i.bak 's/$/ def/' "{}" +; 

se puede ver here para la introducción sed

Otras formas y ou puede utilizar,

awk

for file in * 
do 
    awk '{print $0" def"}' $file >temp 
    mv temp "$file" 
done 

de Bash

for file in * 
do 
    while read -r line 
    do 
     echo "$line def" 
    done < $file >temp 
    mv temp $file 
done 
+1

¿Qué es '+;'? Yo siempre uso '\;'. La página de manual de bash no me hace más sabio. – Thomas

+0

está allí en la página del manual GNU 'find's'. es equivalente a 'xargs' – ghostdog74

+0

hola, el awk es bueno. solo una breve pregunta, ¿cómo se puede aplicar awk '{print $ 0 "def"}' $ file> temp a un número de línea concreto del archivo? – flow

3
for file in ${thousands_of_files} ; do 
    sed -i ".bak" -e "s/$/ def/" file 
done 

La clave aquí es la búsqueda y reemplazo s/// comando. Aquí reemplazamos el final de la línea $ con 2 espacios y su cadena.

encontrar la documentación sed en http://sed.sourceforge.net/#docs

+0

muchas gracias. solo una pregunta, haciendo esto en OSX, ¿por qué aparece el carácter "^ M"? – flow

+0

IIRC, el final de línea - Los caracteres finales EOL en Unix, Mac y Windows son todos diferentes. 'sed' es una utilidad Unix, por lo que utiliza la convención de Unix, es decir, termina cada línea con retorno de carro - CR (^ M), mientras que macs usa alimentación de línea - LF (^ L), Windows BTW usa CR, LF. El punto es que te queda el carácter EOL de Unix. No soy un gurú de Mac, pero debería haber una utilidad para arreglar esto. En mi cuadro Linux hay 'dos2unix' y' unix2dos', pero si no puede encontrar esa herramienta, intente usar 'tr '\ r' '\ f'' para obtener un efecto similar. –

+0

Una nota, Macs usó CR (^ M) ('\ r') hasta OS X, en ese punto cambiaron a LF (^ L) ('\ n'). UNIX siempre ha usado LF (^ L). Tiene razón cuando dijo que Windows usa CRLF (^ M^L) ("\ r \ n"). – amertune

Cuestiones relacionadas