2016-05-27 35 views
-3

Ich versuche, ein kleines Skript zu erstellen, die im Grunde dig +short verwendet den IP eine Website zu finden, und dann Rohr, dass/awk/grep zu sed, um eine Zeile zu ersetzen. Dies ist, was die aktuelle Datei wie folgt aussieht:Verwenden sed oder awk Linie nach Spiel zu ersetzen

#Server 
123.455.1.456 
246.523.56.235 

Also, im Grunde, ich für die ‚#Server‘ Zeile in einer Textdatei suchen möge, und ersetzen Sie dann die beiden Zeilen darunter mit einer IP-Adresse erworben von dig.

Ich verstehe einige der Syntax von sed, aber ich habe wirklich Probleme herauszufinden, wie zwei Zeilen unter einem Treffer zu ersetzen. Jede Hilfe wird sehr geschätzt.

+4

Downvote: Zeigen Sie uns einige Anstrengungen auf Ihrer Seite, um Probleme zu lösen. Denken Sie daran, SO ist kein kostenloser Code für mich Website. Lesen Sie [MCVE]. Ein Hinweis, um damit zu beginnen, ist die Verwendung der Option n/N mit 'sed'. – sjsam

+0

sed ist für einfache Substitutionen auf einzelnen Zeilen, das ist alles. Für alles andere, z.B. Bei diesem Problem sollten Sie awk verwenden. Präzise, ​​testbare Beispieleingabe und erwartete Ausgabe, damit wir Ihnen helfen können, Ihr Problem zu lösen. –

Antwort

0

ist hier, wie in awk:

newip=12.34.56.78 

awk -v newip=$newip '{ 
    if($1 == "#Server"){ 
    l = NR; 
    print $0 
    } 
    else if(l>0 && NR == l+1){ 
    print newip 
    } 
    else if(l==0 || NR != l+2){ 
    print $0 
    } 
}' file > file.tmp 

mv -f file.tmp file 

Erklärung:

  1. Pass $newip zu awk
  2. wenn das erste Feld der aktuellen Zeile #Server ist, l = aktuelle Zeilennummer lassen.
  3. sonst, wenn die aktuelle Zeile eine #Server ist, drucken Sie die neue IP.
  4. sonst, wenn die aktuelle Zeile nicht zwei nach #Server ist, drucken Sie die Zeile.
  5. überschreiben Originaldatei mit geänderter Version.
1

Basierend auf dem OP, ist es nicht 100% klar, was genau zu ersetzen muss, wo, aber hier ist eine eine Einzeiler für den allgemeinen Fall, mit GNU sed und bash. Bringen Sie die zwei Zeilen nach "" mit Standardeingabe:

echo Hoot Gibson | sed -e '/3/{r /dev/stdin' -e ';p;N;N;d;}' <(seq 7) 

Ausgänge:

1 
2 
3 
Hoot Gibson 
6 
7 

Anmerkung: Sed ‚s r Befehl opaquely dokumentiert ist (in Linux sowieso). Für mehr über r, siehe:
"5.9. Der 'r' Befehl fügt die Datei nicht in den Text" in diesem sed FAQ.

Verwandte Themen