2016-10-19 5 views
-1

На этот раз я ищу расширенную версию второго awk-oneliner из принятого ответа на мой question 40066030, поэтому, пожалуйста, посмотрите там в первую очередь, спасибо.awk: удалить строки в определенном блоке текста

Этот AWK должен быть расширен, так что я могу удалить все строки, содержащие слово Foobar из числа же блока (NUM), прежде чем я вставить файл inserted.txt в него:

/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 

Вывод предыдущего 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> 

Выход мне нужно получить:

$ 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> 

Оригинальные входные данные для ссылка:

$ 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> 

Я попытался вставить различные Seach & заменить и удалить фрагменты непосредственно перед печатью, но это не сработало (глупо меня) :(Что-то вроде этого:

/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 

Спасибо авансовый.

ответ

1

Вы должны немного изменить сценарий как таковой

$ 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

Работает идеально. Еще раз спасибо. Я собираюсь купить книгу об awk, отличный инструмент. –

Смежные вопросы