Fügen Sie am Ende jeder Zeile Text hinzu


90

Ich bin in der Linux-Befehlszeile und habe eine Datei mit

127.0.0.1
128.0.0.0
121.121.33.111

Ich will

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

Ich erinnere mich, dass meine Kollegen sed dafür verwendeten, aber nach dem Lesen des sed-Handbuchs immer noch nicht klar, wie es in der Befehlszeile gemacht werden soll.


1
Tolle Frage und ich liebe es, wie du sie gerahmt hast.
Anthony Rutledge

Antworten:


139

Sie könnten versuchen, etwas zu verwenden wie:

sed -n 's/$/:80/' ips.txt > new-ips.txt

Vorausgesetzt, Ihr Dateiformat entspricht genau dem, was Sie in Ihrer Frage beschrieben haben.

Der s///Ersetzungsbefehl stimmt mit dem Ende jeder Zeile in Ihrer Datei überein ( findet es ) (unter Verwendung des $Zeichens) und hängt das Ende an das Ende jeder Zeile an ( ersetzt es ) :80. Die ips.txtDatei ist Ihre Eingabedatei ... und new-ips.txtIhre neu erstellte Datei ( das Endergebnis Ihrer Änderungen ).


Wenn Sie eine Liste von IP-Nummern haben, an die bereits Portnummern angehängt sind (wie von Vlad angegeben und von aragaer angegeben ), können Sie Folgendes versuchen:

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt

Wenn Ihre Eingabedatei beispielsweise so aussieht (beachten Sie Folgendes :80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

Das Endergebnis würde ungefähr so ​​aussehen:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

@Vlad Ja; Aber gemäß den OPs, die als Beispiel eingegeben wurden, sollten in der Liste der IPs keine Portnummern enthalten sein. :) Selbst wenn es ... gäbe, könnte das OP einfach s///vorher ein anderes Sed ausführen , um alle Portnummern am Ende jeder Zeile herauszunehmen.
Summea

1
Ok, nur zur Klarstellung ... Vielleicht sollte es eine Bedingung geben, Leitungen auszuschließen, bei denen bereits ein Port vorhanden ist.
Vlad

3
sed '/:[0-9]*$/ ! s/$/:80/'
Aragaer

3
Fügen Sie es Ihrer eigenen Antwort hinzu. Der Vorschlag, Zeilen mit Ports auszuschließen, ist bereits in Kommentaren enthalten. Ich habe gerade den genauen Befehl geschrieben.
Aragaer

2
Wenn die Datei CRLF-Terminatoren enthält, :80wird diese am Anfang der folgenden Zeile hinzugefügt. Verwenden Sie dos2unixbei Bedarf zuerst die Datei.
djnz0feh

12

Wenn Sie Text am Ende jeder Zeile direkt (in derselben Datei) hinzufügen möchten, können Sie -iParameter verwenden, zum Beispiel:

sed -i'.bak' 's/$/:80/' foo.txt

Die -iOption ist jedoch eine nicht standardmäßige Unix-Erweiterung und möglicherweise nicht auf allen Betriebssystemen verfügbar.

Sie können also in Betracht ziehen, Folgendes zu verwenden ex(was vi -e/ entspricht vim -e):

ex +"%s/$/:80/g" -cwq foo.txt

Dies wird :80zu jeder Zeile hinzugefügt , aber manchmal kann es an leere Zeilen angehängt werden.

Eine bessere Methode ist es, zu überprüfen, ob die Zeile tatsächlich eine Zahl enthält, und diese dann anzuhängen, zum Beispiel:

ex  +"g/[0-9]/s/$/:80/g" -cwq foo.txt

Wenn die Datei ein komplexeres Format hat, sollten Sie stattdessen den richtigen regulären Ausdruck verwenden [0-9].


12

Prägnante Version des Befehls sed :

sed -i s/$/:80/ file.txt

Erläuterung:

  • sed s tream ed itor
    • -i i n-place (Datei an Ort und Stelle bearbeiten)
    • s s Substitutionsbefehl
    • /replacement_from_reg_exp/replacement_to_text/ Aussage
    • $stimmt mit dem Zeilenende überein ( replace_from_reg_exp )
    • :80Text, den Sie am Ende jeder Zeile hinzufügen möchten ( replace_to_text )
  • file.txt der Dateiname


0

Suchen Sie mit einem Texteditor ^Mam Ende jeder Zeile nach (Steuerelement-M oder Wagenrücklauf). Sie müssen sie zuerst entfernen und dann den zusätzlichen Text am Ende der Zeile anhängen.

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt

0
  1. Sie können dies auch mit der Rückreferenztechnik erreichen

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. Sie können auch mit awk wie diesem verwenden

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    

-1

sed -i 's / $ /, / g' foo.txt

Ich mache das ziemlich oft, um am Ende einer Ausgabe ein Komma einzufügen, damit ich es einfach kopieren und in ein Python-Array (oder Ihr Lieblings-Array) einfügen kann

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.