2016-08-08 1 views
-2

Ich möchte sed verwenden, um die IP-Adressen im folgenden Eintrag zu ersetzen.sed, um eine Zeile mit regulärem Ausdruck zu ersetzen

1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT "198.18.193.23,2509.417\;198.18.193.25,2609.417\;198.18.193.27,2709.417" 

1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT "19.18.19.27,1110.400 \; 198.18.193.25,2609.417 \; 198.18.193.27,2709.417"

versucht ich folgendes:

sed -is/"198.18.193.23,2409.417 \; 198.18.193.25,2609.417 \; 198.18.193.27,2709.417"/"198.18.19.27,1110.400"/filename.txt

Der obige Eintrag funktioniert, wenn es nur eine IP-Adresse im tatsächlichen Eintrag. Wenn mehrere IP-Adressen durch reguläre Ausdrücke getrennt sind, funktioniert dies nicht.

Antwort

0

Ihre Frage äußerst unklar ist, aber wenn Sie wollen einfach nur r eplace, was die Liste der IP-Adressen ist in Anführungszeichen, dann ist das einfach:

$ sed 's/"[^"]*"/"198.18.19.27,1110.400"/' file 
1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT "198.18.19.27,1110.400" 

Wenn das nicht das, was Sie dann Ihre Frage Ihre Anforderungen zu klären bearbeiten möchten. Insbesondere erklären, was diese 2 Sätze in Ihrer Frage bedeuten:

  1. Der obige Eintrag funktioniert, wenn es nur eine IP-Adresse im eigentlichen Eintrag gibt.
  2. Wenn mehrere IP-Adressen durch reguläre Ausdrücke getrennt sind, funktioniert dies nicht.

Die oben wurde auf dieser Eingabedatei ausführen:

$ cat file 
1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT "198.18.193.23,2509.417\;198.18.193.25,2609.417\;198.18.193.27,2709.417" 
0

verdreifachen die Backslashes und es wird funktionieren: BTW, die Zitate wurden verlegt, oder Sie müssen ihnen auch entkommen.

Sie haben zu entkommen:

  • die Schrägstriche aus der Schale und von sed, daher die Notwendigkeit von 3 Schrägstriche.
  • die Punkte, aber es funktioniert immer noch so, weil es mit jedem Zeichen übereinstimmt, so dass dot auch passt.

So ist die quickfix ist

sed -i s/"198.18.193.23,2509.417\\\;198.18.193.25,2609.417\\\;198.18.193.27,2709.417"/"198.18.19.27,1110.400"/ file.txt 

2 Probleme:

  • Zitate von sed vollständig ignoriert werden, da die Shell sie verbraucht
  • Punkte werden als Platzhalter betrachtet

Folglich würde diese Zeichenfolge ersetzt werden, die vielleicht nicht das, was Sie wollen (I ersetzt die Punkte durch Ziffern & Buchstaben):

1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT 1987187193723,2509.417\;198718z193v25,2609k417\;198.18.193.27,2709.417 

Ein Reiniger fix wäre

sed -i "s/\"198\.18\.193\.23,2509\.417\\\;198\.18\.193\.25,2609\.417\\\;198\.18\.193\.27,2709\.417\"/\"198.18.19.27,1110.400\"/" file.txt 

Wenn Sie Ausgabe randomisieren möchten, zu ersetzen, sagen, 1110 durch eine Zufallszahl zwischen 1 und 100, tun dies (keine Notwendigkeit für shuf):

sed -i "s/\"198\.18\.193\.23,2509\.417\\\;198\.18\.193\.25,2609\.417\\\;198\.18\.193\.27,2709\.417\"/\"198.18.19.27,$(($RANDOM%100+1)).400\"/" file.txt 
+0

, das funktioniert. Vielen Dank. Schnelle Frage. Ist es möglich, SHUF mit sed zu verwenden? Etwas wie unten. Shuf ist eine Zufallszahl zu generieren. Ich möchte eine zufällige Zahl anstelle von 2609 erzeugen. Sed -is/198.18.193.23.2509.417 \\\ 198.18.193.25.2609.417 \\\ 198.18.193.27.2709.417/198.18.19.27, shuf -i 1-100 -n 1 "/ dns.txt – nims

+0

Um einen zufälligen Wert zu erhalten, benutzen Sie einfach $ RANDOM, es sei denn, Sie benötigen große Werte, was hier nicht der Fall ist. Beitrag bearbeitet. –

+0

Schließen Sie niemals ein Skript in doppelte Anführungszeichen ein, sondern schließen Sie es in einzelne Anführungszeichen ein und umgeben Sie dann den Teil, auf den Sie die Shell in einem einfachen Anführungszeichen verwenden müssen, z. 'sed 's /'" $ var "'/ was auch immer' ', nicht' sed 's/$ var/whataver /'' da letzteres unnötige Vorbehalte und Komplexität mit sich bringt, wie in dieser Antwort zu sehen ist. –

Verwandte Themen