2010-03-25 46 views
8

einem einfachen Textdokument mit mehreren Zeilen wie angegeben:am Ende der Zeile hinzufügen mit sed

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

Ich brauche info 2 Leerzeichen nach dem Ende der Zeile hinzufügen, so dass für jede Zeile würde ich 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 

Ich muss dies für Tausende von Dateien tun. Ich denke, das ist möglich mit Sed, aber ich weiß nicht wie. Irgendein Hinweis? Könnten Sie mir auch einen Link zu einem Tutorial oder einer Tabelle für diese Fälle geben?

Dank

Antwort

14

wenn alle Dateien in einem Verzeichnis

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

es rekursiv zu tun (GNU finden)

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

können Sie here für die Einführung sehen zu sed

Andere Möglichkeiten y ou kann,

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

Was ist '+;'? Ich benutze immer '\;'. Die Bash-Manpage macht mich nicht weiser. – Thomas

+0

es ist dort in GNU 'find's man Seite. es ist äquivalent zu 'xargs' – ghostdog74

+0

hi, der awk ist nett. nur eine kurze Frage, wie kann awk '{print $ 0 "def"}' $ file> temp auf eine konkrete Zeilennummer der Datei angewendet werden? – flow

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

Der Schlüssel hier ist der s/// Befehl zum Suchen und ersetzen. Hier ersetzen wir das Ende der Zeile $ mit 2 Leerzeichen und Ihrem String.

Finden Sie die sed-Dokumentation unter http://sed.sourceforge.net/#docs

+0

Dank viel nutzen. nur eine Frage, unter OSX, warum erscheint das Zeichen "^ M"? – flow

+0

IIRC, das End-of-Line-EOL Ende Zeichen in Unix, Mac und Windows sind alle unterschiedlich. 'sed' ist ein Unix-Dienstprogramm, so dass es die Unix-Konvention verwendet, d. h. jede Zeile mit Zeilenumbruch - CR (^ M) endet, während macs Zeilenvorschub - LF (^ L) verwendet, Windows BTW CR, LF. Der Punkt ist, dass Sie den Unix-EOL-Charakter haben. Ich bin kein Mac-Guru, aber es sollte ein Dienstprogramm geben, um das zu beheben. Auf meiner Linux-Box gibt es 'dos2unix' und' unix2dos', aber wenn Sie ein solches Werkzeug nicht finden können, versuchen Sie es mit 'tr '\ r' '\ f'', um einen ähnlichen Effekt zu erhalten. –

+0

Eine Anmerkung, Macs verwendeten CR (^ M) ('\ r') bis OS X, an diesem Punkt wechselten sie zu LF (^ L) ('\ n'). UNIX hat immer LF (^ L) verwendet. Sie haben Recht, als Sie sagten, dass Windows CRLF (^ M^L) ("\ r \ n") verwendet. – amertune

Verwandte Themen