【问题标题】:sed match multiple lines and then appendsed 匹配多行然后追加
【发布时间】:2012-05-10 07:58:57
【问题描述】:

我想在 verilog 端口列表之后附加一些代码,格式如下:

module module_name (
input wire in1,
input wire in2,
output wire out1
);

我正在寻找有关如何使用 sed(或其他命令)查找以“module”开头并以“);”结尾的端口列表的帮助。然后在 ");" 之后的行添加一些代码

命令:

sed '/^module/,/);/a code to append' test.v

在匹配序列中的每一行上放置“要附加的代码”,而不仅仅是在它之后

module module_name (
code to append
input wire in1,
code to append
input wire in2,
code to append
output wire out1
code to append
);
code to append

【问题讨论】:

    标签: sed


    【解决方案1】:

    这可能对你有用:

    sed '/^module/,/);/!b;/);/a\NEWCODE' file
    

    【讨论】:

    • 谢谢,很好的回答。一直在尝试匹配一个特定的 C++ 函数并在之后添加一个新函数。 sed '/SOME_C_FUNCTION()$/,/^}/!b;/^}/a TO_BE_CONTINUED...' source.cc
    • @Kejml 任何不在以module 开头的行和包含); 的行之间的行都将正常打印。否则 NEWCODE 将附加到包含 ); 的行。
    • 我看到了它的作用,我能够适应我的情况,所以谢谢你。但我很好奇为什么,因为我对 sed 和它的语法很陌生。
    • @Kejml /start/,/end/ 关注startend 之间的一系列行。 ! 否定该范围,即不在startend 之间。 b 命令与 goto 类似,但它本身会脱离当前命令。 /); 关注包含); 的任何行。最后,a 会在当前行之后的新行中附加以下内容,即NEWCODE。 HTH
    【解决方案2】:

    这有点笨拙,但它会完成这项工作:

    sed ':a /module/s/);/);\ncode to append/;t;N;b a' filename
    

    【讨论】:

      【解决方案3】:

      您可以使用命令行perl 代替 sed,如下所示:

      perl -0pe 's@(module[^(]*\([^)]*\)\s*;)@$1'"\na code to append"'@' test.v
      

      输出

      module module_name (
      input wire in1,
      input wire in2,
      output wire out1
      );
      a code to append
      

      【讨论】:

        【解决方案4】:

        既然你说 sed 或任何其他命令,我会用 perl 来回答。您可以在 perl 中执行以下操作:

        # perl -pe 'BEGIN { $/ = undef; }s#(^module.+?\);)#$1\ncode to append#omgs' test.v
        
        module module_name (
        input wire in1,
        input wire in2,
        output wire out1
        );
        code to append
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-13
          • 2022-01-17
          • 2013-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-17
          相关资源
          最近更新 更多