1

我正在使用 verilog 并需要在唯一块中编辑特定行,但不确定如何继续

文件.v

...

    block1 block1(
      .port1(port1),
      .port2(port2),
    );

    block2 block2(
      .(port2)(port2),
      .(port3)(port3)
    );
....

我需要以某种方式删除block1中port2的“,”。不修改block2。还有多个包含 port2 的块。

    block1 block1(
      .port1(port1),
      .port2(port2)
    );

我一直在尝试 awk 和 sed 行的范围,但没有获得成功修改文件的结果。非常感谢任何建议或解决方案

4

4 回答 4

3

这将删除在块结束之前出现的任何逗号(空格 then );):

perl -0777 -pe 's/,(?=\s*\);)//g'

笔记:

  • -0777导致 perl 将所有输入作为单个字符串 slurp。这是必需的,因为
    1. 我们知道中间有换行符,所以我们不想逐行阅读
    2. 逗号和括号之间可能有空行,因此按“段落”阅读也不起作用。
  • -p导致 perl 在修改后打印输入。
  • 正则表达式是最棘手的部分
    • 它找到一个逗号,然后向前查找以匹配零个或多个空白字符(包括空格、制表符、换行符等),后跟一个右括号和一个分号。
    • 前瞻文本不是匹配文本的一部分(前瞻被称为“零宽度断言”)——匹配的文本将只是逗号
    • 如果匹配,则将逗号替换为空字符串。
    • 标志说在g字符串中全局执行此操作。
于 2013-10-31T18:09:26.180 回答
1

这可能会为您完成工作

sed '/block1 block1/,/);/{s/\((port2)\),/\1/}' file.v
于 2013-10-31T17:27:53.290 回答
1

怎么样:

awk -v RS="" '/block1/{sub("port2),","port2)")}7' file
于 2013-10-31T17:41:28.067 回答
1

我猜您想删除位于右括号 ( )) 后跟换行符、右括号和分号 ( );) 之后的逗号?在这种情况下,这可能对您有用:

sed -r ':a;N;s/\),\n\s*\);/)\n);/;P;D;ba'
         | | | |---------| |---|  | | |
         | | |      |        |    | | -- branch to label "a"
         | | |      |        |    | -- delete up to first newline of pattern space
         | | |      |        |    -- print up to first newline of pattern space
         | | |      |        -- replace pattern
         | | |      -- search pattern
         | | -- substitute
         | -- read next line into pattern space (append)
         -- branch label "a"
于 2013-10-31T17:46:07.757 回答