sed или perl + вставка текста между двумя строками - PullRequest
3 голосов
/ 11 августа 2010

У меня есть следующий файл: (example.txt показывает вниз)

Мне нужно отредактировать файл, основная проблема заключается в добавлении текста между двумя известными строками в файле

first_line = ")"

second_line = "NIC Hr_Nic ("

Например

Необходимо добавить следующее:

    haattr -add RVG StorageRVG -string
    haattr -add RVG StorageDG -string
    haattr -add RVG StorageHostIds -string
    haattr -delete RVG Primary
    haattr -delete RVG SRL
    haattr -delete RVG RLinks

Между

Первая строка совпадения ")"

И

вторая строка матча "NIC Hr_Nic ("

Как описано в файле example.txt

Как это сделать с помощью sed ... (Если это сложно с помощью sed, это также возможно с помощью perl)

примечание (нужно получить два аргумента первый аргумент - первая строка соответствия (first_line arg) второй аргумент - вторая строка соответствия (second_line arg)

файл example.txt:

    group Hr_Grp (
    SystemList = { london1 = 0, london2 = 1 }
    AutoStartList = { london1, london2 }
    )

    NIC Hr_Nic (
            Device = qfe0
            )

    IP Hr_Ip(
            Device = qfe0
            Address = "1.1.1.1"         // Virtual IP
            )

    DiskGroup Hr_Dg(
            DiskGroup = hrdg
            )

    RVG Hr_Rvg (
            RVG = hr_rvg
            DiskGroup = hrdg
            )

    Hr_Rvg requires Hr_Dg
    Hr_Rvg requires Hr_Ip
    Hr_Ip requires Hr_Nic

Пример файла после редактирования sed:

    group Hr_Grp (
    SystemList = { london1 = 0, london2 = 1 }
    AutoStartList = { london1, london2 }
    )


    haattr -add RVG StorageRVG -string
    haattr -add RVG StorageDG -string
    haattr -add RVG StorageHostIds -string
    haattr -delete RVG Primary
    haattr -delete RVG SRL
    haattr -delete RVG RLinks



    NIC Hr_Nic (
            Device = qfe0
            )

    IP Hr_Ip(
            Device = qfe0
            Address = "1.1.1.1"         // Virtual IP
            )

    DiskGroup Hr_Dg(
            DiskGroup = hrdg
            )

    RVG Hr_Rvg (
            RVG = hr_rvg
            DiskGroup = hrdg
            )

    Hr_Rvg requires Hr_Dg
    Hr_Rvg requires Hr_Ip
    Hr_Ip requires Hr_Nic

1 Ответ

0 голосов
/ 11 августа 2010

Попробуйте:

text=$(<file)
sed -e '/[[:blank:]]*)[[:blank:]]*/{:a;n;/NIC Hr_Nic (/i\' -e "$text" -e 'ba}'

Я использую i для вставки и переменную, поскольку команда r (чтение файла) добавляет после текущей строки.Вы также можете установить переменную следующим образом:

read -d '' -r text<<EOF
haattr -add RVG StorageRVG -string
haattr -add RVG StorageDG -string
etc.
EOF

или

text="haattr -add RVG StorageRVG -string
haattr -add RVG StorageDG -string
etc."
...