1

Нужна помощь в решении этой задачи. Я пробовал несколько сценариев оболочки, чтобы сделать это, но не уверен, что я подхожу к этой проблеме правильно. У меня есть файл, который содержит несколько блоков данных, как это:

multipath {

wwid 360000970000195701574533030394530

alias DG_cln_DRPCU04_Oberon_IX_disk59

}

multipath {

wwid 360000970000195701574533030394531

alias DG_cln_DRPCU04_Oberon_IX_disk60
                }

multipath {

wwid 360000970000195701574533030394532

alias DG_cln_DRPCU04_Oberon_IX_disk61

}

multipath {

wwid 360000970000195701574533030394533

alias DG_cln_DRPCU04_Oberon_IX_disk62

}

multipath {

wwid 360000970000195701574533030394534

alias DG_cln_DRPCU04_Oberon_IX_disk63

}

multipath {

wwid 360000970000195701574533030394535

alias DG_cln_DRPCU04_Oberon_IX_disk6

}

multipath {

wwid 360000970000195701574533030394536

alias DG_cln_DRPCU04_Oberon_IX_disk64

}

Я хочу закомментировать только конкретные блоки. Я хочу изменить только те строки в блоке, для которых я выделен.

Пример:

grep -B 2 -A 1 DG_cln_DRPCU04_Oberon.

Он будет возвращать каждый блок, который содержит DG_cln_DRPCU04_Oberon. Затем я хочу закомментировать весь блок из 4 строк для каждого возвращаемого уникального блока. Есть простой способ сделать это? Спасибо за любые советы о том, как подойти к этой проблеме.

1 ответ1

0

Вы можете сделать это в awk . Поместите следующий скрипт в файл и затем вызовите awk -v pattern=disk60 -f script_file data_file:

found { buf = buf "\n" $0 }
/multipath *\{/ { buf = $0; found = 1 }
!found { print }
$0 ~ pattern { matched = 1 }
/\}/ {
    if (matched) {
        gsub(/\n/, "\n#", buf);
        buf = "#" buf;
    }
    print buf "\n";
    buf = "";
    found = matched = 0;
}

Это работает следующим образом: Если строка содержит multipath и открывающую фигурную скобку, запустите новый буфер и установите found переменную. Пока found , истина, добавьте строку в буфер. Если found не так, выведите строку сразу, так как мы находимся за пределами интересного блока. Если строка соответствует шаблону, который вы ищете (disk60 в моем примере), установите переменную matched . Наконец, если строка содержит закрывающую фигурную скобку, проверьте, matched ли значение true. Если это так, закомментируйте строки в буфере. Распечатать буфер и сбросить переменные.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .