awk sed perl,替换一系列行中的特定模式

时间:2013-10-31 17:13:22

标签: replace sed awk block

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

file.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 个答案:

答案 0 :(得分:3)

这将删除在块结束之前发生的任何逗号(空格,然后是);):

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

注意:

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

答案 1 :(得分:1)

这可能会为你完成这项工作

sed '/block1 block1/,/);/{s/\((port2)\),/\1/}' file.v

答案 2 :(得分:1)

怎么样:

awk -v RS="" '/block1/{sub("port2),","port2)")}7' file

答案 3 :(得分:1)

我想你想删除一个关闭paren())之后的逗号,后面跟一个换行符,一个结束符号和一个分号();)? 在这种情况下,这可能适合您:

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"