2013-10-31 56 views
1

我的Verilog工作,需要编辑一个独特的区块内的特定行内替换特定的模式,但我不确定如何进行AWK sed的Perl中,一个行范围

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线的范围,但没有得到结果成功地修改该文件。任何建议或解决方案是非常赞赏

回答

3

这将删除发生仅一个街区结束之前(空格然后);)任何逗号:

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

注:

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

太棒了!我需要学习perl一个内线... – jkshah

+0

谢谢,这比我想象的更强大!你认为你可以更详细地解释我吗?特别是在搜索逗号之前如何搜索换行符); – user1539348

1

这可能对做的工作,你

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

怎么样:

awk -v RS="" '/block1/{sub("port2),","port2)")}7' file 
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"