2013-10-31 55 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"