2017-09-18 4 views
0

Ich bin neu in Sed Skript. Ich habe erforscht, wie man Text zu einer Zeile in Datei hinzufügt.Einfügen in die Mitte einer Zeile in einer Textdatei sed

so die Linie, die ich in der Textdatei haben wie folgt aussieht

hosts allow = 192.168.122. 172.24.0 

i IP hinzufügen möchten so Zeile sieht aus wie

hosts allow = 192.168.122. 192.12.0 172.24.0 

Durch Versuch und Irrtum ich nur haben:

sed -i '/allow/ s/.*/&,192.12.0./' testfile 

was gibt:

hosts allow = 192.168.122. 172.24.0. 192.12.0. 
+1

Willkommen bei Stack Overflow! Bitte bearbeiten Sie Ihre Frage, um [den Code, den Sie bisher haben] (http://whathaveyoutried.com) anzuzeigen. Sie sollten mindestens einen Umriss (aber vorzugsweise einen [mcve]) des Codes angeben, mit dem Sie Probleme haben, dann können wir versuchen, bei dem spezifischen Problem zu helfen. Sie sollten auch [fragen] lesen. –

+0

Definieren Sie jetzt, was Sie mit der richtigen Position meinen. IMHO Position impliziert eine Zahl, wie 10 vom linken Rand. Aber es könnte mit Worten rechnen, also in deinem Fall nach dem ersten Wort? Andere Interpretationen kommen mir in den Sinn, also bitte klarstellen. (Warum konnte der neue Text nicht der erste sein?). Viel Glück. – shellter

Antwort

0

Überprüfen dieser Test:

$ cat file1 
hosts allow = 192.168.122. 172.24.0 
hosts allow = 111.111.111. 222.222.222 333.333.333 

$ sed -E 's/(.* = .*)(.*)/\1 george \2/g' file1 
hosts allow = 192.168.122. george 172.24.0 
hosts allow = 111.111.111. 222.222.222 george 333.333.333 

$ sed -r 's/(.* = .[^ ]*)(.*)/\1 george \2/g' file1 
hosts allow = 192.168.122. george 172.24.0 
hosts allow = 111.111.111. george 222.222.222 333.333.333 

Dieser Test verwendet mit erweiterten regex Unterstützung (-E oder -r-Schalter) und die Erfassung Gruppen eingeschlossen in()

0

Ihre Frage ist zu vage sed zu sagen sicher (möchten Sie eine Zeichenfolge in der Mitte eines Satzes oder nach dem ersten oder vor dem letzten oder an einem festen Ort oder etwas anderes hinzufügen), aber das könnte das sein, wonach Sie suchen:

$ sed 's/ [^[:space:]]*/& 192.12.0/2' file 
hosts allow = 192.12.0 192.168.122. 172.24.0 

$ sed 's/ [^[:space:]]*/& 192.12.0/3' file 
hosts allow = 192.168.122. 192.12.0 172.24.0 

$ sed 's/ [^[:space:]]*/& 192.12.0/4' file 
hosts allow = 192.168.122. 172.24.0 192.12.0 

0

Hier ist ein awk-Lösung, die ich als sed Lösungen besser lesbar finden:

awk '$1$2$3 == "hostsallow=" { $NF="192.12.0 $NF" } { print }' \ 
    testfile > tmp && mv tmp testfile 

Dies nimmt die ersten drei Spalten und stellt sicher, sie verketten „= hostsallow“ zu ohne Leerzeichen (ich bezweifle, werden Sie in eine host sallow = … Zeile), nimmt dann den Wert der letzten Spalte (identifiziert als NF für die Anzahl der Felder und deren Wert wird identifiziert mit einem $) und weist ihm den neuen Wert, ein Leerzeichen und den alten Wert zu. Alle Zeilen werden dann gedruckt. Achtung, dies wird Leerräume reduzieren (in diesem Fall sehe ich das als Feature).

Leider hat awk keine -i Option wie sed, also muss diese Datei in einer temporären Datei gespeichert und dann wieder auf die Originaldatei gesetzt werden.

Verwandte Themen