2010-03-25 15 views
8

dato un documento di testo con diverse linee come:Aggiungere alla fine della linea con sed

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

ho bisogno di aggiungere alcune informazioni 2 posti dopo la fine della linea, quindi per ogni linea vorrei get:

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

Ho bisogno di farlo per migliaia di file. Immagino che questo sia possibile fare con sed, ma non so come farlo. Qualche suggerimento? Potresti darmi qualche link con un tutorial o una tabella per questo caso?

Grazie

risposta

14

se tutti i file sono in una directory

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

per farlo ricorsivo (GNU trovare)

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

si può vedere here per l'introduzione to sed

Altri modi y ou può utilizzare,

awk

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

Bash shell

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

Cosa significa '+;'? Io uso sempre '\;'. La manpage di bash non mi rende più saggio. – Thomas

+0

è lì nella pagina man di GNU 'find's'. è equivalente a 'xargs' – ghostdog74

+0

ciao, quello awk è bello. solo una breve domanda, come può awk '{print $ 0 "def"}' $ file> temp essere applicato ad un numero di linea concreta del file? – flow

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

La chiave qui è la ricerca e sostituzione s/// comando. Qui sostituiamo la fine della riga $ con 2 spazi e la stringa.

trovare la documentazione sed a http://sed.sourceforge.net/#docs

+0

grazie mille. solo una domanda, facendo questo su OSX, perché appare il carattere "^ M"? – flow

+0

IIRC, end-of-line - I caratteri EOL finali in Unix, Mac e Windows sono tutti diversi. 'sed' è un'utilità Unix quindi usa la convenzione Unix, cioè termina ogni riga con Carriage Return - CR (^ M), mentre macs usa Line Feed - LF (^ L), Windows BTW usa CR, LF. Thepoint è che ti rimane il carattere EOL di Unix. Non sono un guru del Mac, ma dovrebbe esserci un'utilità per risolvere questo problema. Sulla mia macchina Linux ci sono 'dos2unix' e' unix2dos', ma se non riesci a trovare uno strumento del genere, prova a usare 'tr '\ r' '\ f'' per ottenere un effetto simile. –

+0

Una nota, i Mac hanno utilizzato CR (^ M) ('\ r') fino a OS X, a quel punto sono passati a LF (^ L) ('\ n'). UNIX ha sempre utilizzato LF (^ L). Hai ragione quando hai detto che Windows utilizza CRLF (^ M^L) ("\ r \ n"). – amertune

Problemi correlati