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.