Комментируйте отдельные строки, используя регулярное выражение и sed

Вы пробовали нажимать кнопку меню монитора? Используйте его для выбора входа HDMI.

У меня была похожая проблема, я был полностью озадачен, пока не разобрался с ней. Поделиться на случай, если вы это не заметили.

1
01.09.2016, 09:42
2 ответа

Использование GNU sed

Это, кажется, закомментирует строки, которые вы хотите:

sed -z 's|HS55_LH_OPTALL_GND_Z[^;]*;|/*&*/|g' abc

Например:

$ sed -z 's|HS55_LH_OPTALL_GND_Z[^;]*;|/*&*/|g' abc
module util_minor_rev_id(minor_rev);
      output [3:0] minor_rev;
      wire [3:0] minor_rev;
      wire n_15, n_16, n_17, n_18, n_19, n_20, n_21, n_22;
      /*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
           (minor_rev[0]));*/
      /*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
           (minor_rev[1]));*/
xyz
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
           (minor_rev[2]));*/
      /*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
           (minor_rev[3]));*/
    endmodule

Параметр -z (только GNU) говорит sed читать файл не по строке за раз, а пока он не найдет символ NUL. Поскольку разумные текстовые файлы никогда не имеют символа NUL, это приводит к чтению всего файла сразу.

Вышеупомязанная команда использует одну команду замены, чтобы поместить /* и */ вокруг интересующих строк.

Чтобы изменить файл на месте:

sed -i.bak -z 's|HS55_LH_OPTALL_GND_Z[^;]*;|/*&*/|g' abc

Использование другого sed

Для BSD/OSX или другого sed:

sed '/HS55_LH_OPTALL_GND_Z/{:a; /;/{bb}; N; ba; :b; s|H|/*H|; s|;|;*/|;}' abc

Например:

$ sed '/HS55_LH_OPTALL_GND_Z/{:a; /;/{bb}; N; ba; :b; s|H|/*H|; s|;|;*/|;}' abc
module util_minor_rev_id(minor_rev);
      output [3:0] minor_rev;
      wire [3:0] minor_rev;
      wire n_15, n_16, n_17, n_18, n_19, n_20, n_21, n_22;
      /*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
           (minor_rev[0]));*/
      /*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
           (minor_rev[1]));*/
xyz
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
           (minor_rev[2]));*/
      /*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
           (minor_rev[3]));*/
    endmodule

Чтобы изменить файл на месте:

sed -i.bak '/HS55_LH_OPTALL_GND_Z/{:a; /;/{bb}; N; ba; :b; s|H|/*H|; s|;|;*/|;}' abc

Ограничение: Поскольку ни одна из этих команд sed не анализирует файл, могут быть ситуации, когда они делают неправильные вещи.

Как это работает

  • /HS55_LH_OPTALL_GND_Z/{...}

    При этом выбираются строки, содержащие HS55_LH_OPTALL_GND_Z, и для этих строк выполняются команды внутри фигурных скобок. Эти команды описаны ниже.

  • :a

    Это определяет метку a.

  • /;/{bb}

    Если пространство шаблона в данный момент содержит ; , затем ветвь на метку b.

  • N

    Прочитайте в следующей строке из файла и сохраните его в пространстве шаблона.

  • ba

    Ветвь для обозначения a.

  • :b

    Это определяет метку b.

  • с| Н|/*Ч|; с|;|; */|;

    Если мы доберемся сюда, это означает, что пространство шаблона начинается со строки, содержащей HS55_LH_OPTALL_GND_Z и заканчивается строкой, содержащей ; . Для этого пространства шаблонов мы ставим /* перед первым H и */ после первого ;.

0
27.01.2020, 23:47

Используйте не жадное сопоставление:

pcregrep -Mno '^\s*HS55_LH_OPTALL_GND_Z.*(\n|.)*?;$' file

Вывод:

5:      HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
           (minor_rev[0]));
7:      HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
           (minor_rev[1]));
10:HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
           (minor_rev[2]));
12:      HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
           (minor_rev[3]));

Вы также можете прокомментировать строки с помощью Vim:

:%s!^\s*\zsHS55_LH_OPTALL_GND_Z\_.\{-};$!/* & */!

Результат:

module util_minor_rev_id(minor_rev);
    output [3:0] minor_rev;
    wire [3:0] minor_rev;
    wire n_15, n_16, n_17, n_18, n_19, n_20, n_21, n_22;
    /* HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
        (minor_rev[0])); */
    /* HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
        (minor_rev[1])); */
xyz
/* HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
        (minor_rev[2])); */
    /* HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
        (minor_rev[3])); */
    endmodule
1
27.01.2020, 23:47

Теги

Похожие вопросы