2010-03-25 11 views
8

donné un document texte avec plusieurs lignes comme:Ajouter à la fin de la ligne avec sed

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

Je dois ajouter des informations 2 places après la fin de la ligne, donc pour chaque ligne je voudrais obtenir:

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

Je dois faire cela pour des milliers de fichiers. Je suppose que c'est possible de faire avec sed, mais je ne sais pas comment. Un indice? Pourriez-vous également me donner un lien avec un tutoriel ou une table pour ce cas?

Merci

Répondre

14

si tous vos fichiers se trouvent dans un répertoire

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

de le faire récursif (GNU find)

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

vous pouvez voir here pour l'introduction à sed

D'autres façons y ous pouvez utiliser,

awk

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

shell Bash

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

Qu'est-ce que '+;'? J'utilise toujours '\;'. La page de manuel de bash ne me rend pas plus sage. – Thomas

+0

est là dans la page de manuel GNU 'find's'. son équivalent à 'xargs' – ghostdog74

+0

salut, l'awk on est gentil. juste une courte question, comment awk '{print $ 0 "def"}' $ fichier> temp peut-il être appliqué à un numéro de ligne concret du fichier? – flow

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

La clé est la commande de recherche et de remplacer s/// ici. Ici, nous remplaçons la fin de la ligne $ avec 2 espaces et votre chaîne.

Trouver la documentation sed à http://sed.sourceforge.net/#docs

+0

merci beaucoup. juste une question, en faisant cela sur OSX, pourquoi le caractère "^ M" apparaît-il? – flow

+0

IIRC, le caractère de fin de ligne de fin de ligne dans Unix, Mac et Windows sont tous différents. 'sed' est un utilitaire Unix donc il utilise la convention Unix, c'est-à-dire terminant chaque ligne avec Carriage Return - CR (^ M), alors que macs utilise Line Feed - LF (^ L), Windows BTW utilise CR, LF. Le point est qu'il vous reste le caractère Unix EOL. Je ne suis pas un gourou Mac, mais il devrait y avoir un utilitaire pour résoudre ce problème. Sur ma machine Linux, il y a 'dos2unix' et' unix2dos', mais si vous ne trouvez pas un tel outil, essayez d'utiliser 'tr '\ r' '\ f'' pour obtenir un effet similaire. –

+0

Une note, les Mac utilisaient CR (^ M) ('\ r') jusqu'à OS X, à quel point ils sont passés à LF (^ L) ('\ n'). UNIX a toujours utilisé LF (^ L). Vous avez raison lorsque vous avez dit que Windows utilise CRLF (^ M^L) ("\ r \ n"). – amertune

Questions connexes