Команда Sed только для воздействия на первый экземпляр - PullRequest
0 голосов
/ 20 февраля 2019

Я ищу определенную строку и добавляю серию строк, следующих за ней.У меня сейчас есть команда sed:

sed -i "
/CLIENTVERSION/ {
n
a\define service{
a\        use                     generic-service
a\        host_name               $var_hostname
a\        service_description     NSCLient++ Version
a\        check_command           check_nt!CLIENTVERSION
a\        }
}" windows.cfg;

Файл windows.cfg содержит определения служб для конкретных хостов.(Хосты SBS и Test1 уже находятся в файле, и Test2 - это вывод после выполнения моей команды. Мой вывод:

define service{
    use                     generic-service
    host_name               sbs
    service_description     NSClient++ Version
    check_command           check_nt!CLIENTVERSION
    }
define service{
    use                     generic-service
    host_name               Test2
    service_description     NSCLient++ Version
    check_command           check_nt!CLIENTVERSION
    }
 define service{
    use                     generic-service
    host_name               Test
    service_description     NSCLient++ Version
    check_command           check_nt!CLIENTVERSION
    }
define service{
    use                     generic-service
    host_name               Test2
    service_description     NSCLient++ Version
    check_command           check_nt!CLIENTVERSION
    }

И я хочу:

define service{
    use                     generic-service
    host_name               sbs
    service_description     NSClient++ Version
    check_command           check_nt!CLIENTVERSION
    }
define service{
    use                     generic-service
    host_name               Test2
    service_description     NSCLient++ Version
    check_command           check_nt!CLIENTVERSION
    }
define service{
    use                     generic-service
    host_name               Test
    service_description     NSCLient++ Version
    check_command           check_nt!CLIENTVERSION
    }

Я думал, чтопараметр / g сделал это, но я не установил его, и я не уверен, почему он добавляет определение сервиса "Test2" дважды.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Подход, заимствованный из , этот ответ работает здесь:

sed -i "
/CLIENTVERSION/ {
n
a\define service{
a\        use                     generic-service
a\        host_name               $var_hostname
a\        service_description     NSCLient++ Version
a\        }
:a;n;ba}" windows.cfg

Разница заключается в последней строке скрипта, которая помещает его в цикл, который молча читает остальную частьфайл без какой-либо обработки.

0 голосов
/ 20 февраля 2019

Возможно, вам будет проще работать с awk.Использование GNU awk для gensub () и multi-char RS:

$ cat tst.sh
#!/bin/env bash
infile="$1"

var_hostname="Test2"

awk -v RS='^$' -v ORS= '
NR==FNR { rec=$0; next }
{ print gensub(/CLIENTVERSION\n[^\n]+\n/,"&"rec,1) }
' - "$infile" <<!
define service{
    use                     generic-service
    host_name               $var_hostname
    service_description     NSCLient++ Version
    check_command           check_nt!CLIENTVERSION
    }
!

.

$ ./tst.sh file
define service{
    use                     generic-service
    host_name               sbs
    service_description     NSClient++ Version
    check_command           check_nt!CLIENTVERSION
    }
define service{
    use                     generic-service
    host_name               Test2
    service_description     NSCLient++ Version
    check_command           check_nt!CLIENTVERSION
    }
define service{
    use                     generic-service
    host_name               Test
    service_description     NSCLient++ Version
    check_command           check_nt!CLIENTVERSION
    }

Просто измените awk на awk -i inplace для редактирования на месте (например, `sed -i) если хочешь.Выше было выполнено для этого входного файла:

$ cat file
define service{
    use                     generic-service
    host_name               sbs
    service_description     NSClient++ Version
    check_command           check_nt!CLIENTVERSION
    }
define service{
    use                     generic-service
    host_name               Test
    service_description     NSCLient++ Version
    check_command           check_nt!CLIENTVERSION
    }
...