2016-10-19 7 views
-1

Diesmal suche ich nach einer erweiterten Version des zweiten awk-oneliner aus der angenommenen Antwort auf meine question 40066030, also bitte schau erstmal dort nach, danke.awk: Lösche Zeilen in einem bestimmten Textblock

Diese awk erweitert werden, um alle Zeilen i löschen können das Wort foobar aus der gleichen Blocknummer (num) enthält, bevor die Datei i inserted.txt in sie einzufügen:

/usr/bin/awk -v num=2 'NR==FNR{ins=ins?ins ORS $0:$0; next} /<\/VirtualHost>/ && ++c==num{print ins} 1' inserted.txt vhosts-ssl.conf 

Ausgabe der vorherigen awk :

$ cat vhosts-ssl.conf 
<VirtualHost *:443> 
    vhost 1 
    foobar 1 
    foobar 2 
    barfoo 1 
    barfoo 2 
</VirtualHost> 

<VirtualHost *:443> 
    vhost 2 
foobar 2 
    barfoo 1 
foobar 1 
    barfoo 2 
inserted line 1 
inserted line 2 
</VirtualHost> 
<VirtualHost *:443> 
vhost 3 
    foobar 1 

    barfoo 1 
foobar 2 

    barfoo 2 
</VirtualHost> 

<VirtualHost *:443> 

    vhost 4 
foobar 1 
    foobar 2 

    barfoo 1 
barfoo 2 

</VirtualHost> 

Output ich brauche zu bekommen:

$ cat vhosts-ssl.conf 
<VirtualHost *:443> 
    vhost 1 
    foobar 1 
    foobar 2 
    barfoo 1 
    barfoo 2 
</VirtualHost> 

<VirtualHost *:443> 
    vhost 2 
    barfoo 1 
    barfoo 2 
inserted line 1 
inserted line 2 
</VirtualHost> 
<VirtualHost *:443> 
vhost 3 
    foobar 1 

    barfoo 1 
foobar 2 

    barfoo 2 
</VirtualHost> 

<VirtualHost *:443> 

    vhost 4 
foobar 1 
    foobar 2 

    barfoo 1 
barfoo 2 

</VirtualHost> 

Original-Eingangsdaten für Referenz:

$ cat inserted.txt 
inserted line 1 
inserted line 2 
$ cat vhosts-ssl.conf 
<VirtualHost *:443> 
    vhost 1 
    foobar 1 
    foobar 2 
    barfoo 1 
    barfoo 2 
</VirtualHost> 

<VirtualHost *:443> 
    vhost 2 
foobar 2 
    barfoo 1 
foobar 1 
    barfoo 2 
</VirtualHost> 
<VirtualHost *:443> 
vhost 3 
    foobar 1 

    barfoo 1 
foobar 2 

    barfoo 2 
</VirtualHost> 

<VirtualHost *:443> 

    vhost 4 
foobar 1 
    foobar 2 

    barfoo 1 
barfoo 2 

</VirtualHost> 

Ich habe versucht, verschiedene Suchanfrage & ersetzen und löschen Schnipsel direkt vor dem Druck einzusetzen, aber das hat nicht funktioniert (dumm mich) :(So etwas:

/usr/bin/awk -v num=2 'NR==FNR{ins=ins?ins ORS $0:$0; next} /<\/VirtualHost>/ && ++c==num{!/foobar/ print ins} 1' inserted.txt vhosts-ssl.conf 

Danke voraus.

Antwort

1

Sie haben perfekt das Skript leicht als solche

$ awk -v num=2  'NR==FNR{ins=ins?ins ORS $0:$0; next} 
    /<VirtualHost/&&++c==num{p=1} 
     p&&/<\/VirtualHost>/{print ins; p=0} 
       !p||!/foobar/' insert.file orig.file 
+0

Werke zu verändern. Danke noch einmal. Ich werde ein Buch über awk kaufen, wirklich tolles Werkzeug. –

Verwandte Themen