2017-09-01 72 views
0

例如,網表是:提取特定的細胞從網表

INV i0 (.I(a0), 
    .O(b0)); 

BUF i1 (.I(a1), 
    .O(b1)); 

我想從網表提取BUF細胞並寫入另一個文件。 正如你所知道的,網表的一個單元格內總是存在換行符,那麼查找我想要提取的單元格的正則表達式格式是什麼?

我試過grep ^BUF.*$但它只會返回BUF i1 (.I(a1),,因爲有一個換行符,我沒有提取整個BUF單元格。

+0

正確解析的Verilog,使用https://metacpan.org/ pod/Verilog-Perl – toolic

回答

1

的grep溶液:

$ grep -Poz 'BUF[^;]+;' input.txt 
BUF i1 (.I(a1), 
.O(b1)); 
BUF i1 (.I(a1), 
.O(b1)); 

AWK溶液:

$ cat vlg.awk 
BEGIN { RS="" } 
/BUF/ 

輸入:

$ cat input.txt 
INV i0 (.I(a0), 
.O(b0)); 

BUF i1 (.I(a1), 
.O(b1)); 

INV i0 (.I(a0), 
.O(b0)); 

BUF i1 (.I(a1), 
.O(b1)); 

輸出:

$ awk -f vlg.awk input.txt 
BUF i1 (.I(a1), 
.O(b1)); 
BUF i1 (.I(a1), 
.O(b1)); 

或只是命令行:$ awk 'BEGIN {RS=""} /BUF/' input.txt

Note: 在awk的解決方案,RS=""RS="\n\n+"之間的差異應該注意。第一個選項忽略輸入數據中的前導換行符,並且 - 如果文件在最後一條記錄後沒有多餘的空行結束 - 最後的換行符將從記錄中刪除。使用第二個選項,這個特殊處理沒有完成。請閱讀gawk docs。二手評論由Ed Morton.`

+1

您應該提到awk解決方案僅適用於GNU awk,原因是多字符RS。對於他們在任何awk中改變'RS =「\ n \ n」'到'RS =「」'。而且,在awk'/ BUF/{print $ 0}中''通常寫成只是'/ BUF /',因爲'{print $ 0}'是給定真實條件的默認動作。如果您可以輸出多個記錄,則還應該設置ORS =「\ n \ n」'以匹配輸入的空行分隔格式。 –

+0

您應該提到'RS =「」'會導致輸入數據文件中的前導換行被忽略,並且如果文件在最後一條記錄後沒有多餘的空行結束,則最後的換行符將從記錄中刪除。 Ergo:這是+1。明確的印刷應該去,我同意。 'ORS =「\ n \ n」'加法是一個假設。 –

+0

如果在文件開始時有任何完全空行,那麼是的,他們會被忽略,但a)他們爲什麼會在那裏和b)如果他們是那麼爲什麼不應該忽略它們?c)段落的行爲模式已經有很好的文檔記錄,並且與使用默認FS時忽略記錄中的前導空白的方式一致 - 每次使用時都不需要描述。以空行結尾的文件不會導致最終的換行符被刪除。是的,我們必須假設OP是否希望在輸出記錄之間插入新行,例如在他的輸入中。 –

1

隨着SED:

sed -n '/^BUF/{N;p}' file 

^BUF發現,該行合併下一行(N)和輸出(p)。

0

grep的 oneliner

grep "BUF " -A1 input >> output 

對於每一個BUF比賽,打印匹配行和後一行。

輸出文件:

BUF i1 (.I(a1), 
    .O(b1)); 
0

這將任何UNIX系統上的任何AWK穩健運行:

awk -v RS= '$1=="BUF"' file 

,如果你能在輸入有多個「BUF」塊,那麼你就可能需要輸入中的空白行與輸入中的空行相同,然後您可以使用:

awk -v RS= -v ORS='\n\n' '$1=="BUF"' file 

上述和其他答案之間的主要區別在於,由於它對每個記錄中的第一個非空字符串進行精確的字符串比較,它將工作,不管在行上的BUF之前是否有空格,即使相似的文本(例如BUFFER)出現在其他行上,並且即使BUF出現在文件其他部分的錯誤位置(例如註釋中)也可以工作。

例如與該輸入文件:

$ cat file 
INV i0 (.I(a0), # not BUF here 
    .O(b0)); 

    BUF i1 (.I(a1), 
    .O(b1)); 

BUFFER i1 (.I(a1), 
    .O(b1)); 

這裏是如何的所有提出的解決方案迄今的行爲:

$ awk -v RS= '$1=="BUF"' file 
    BUF i1 (.I(a1), 
    .O(b1)); 
$ 

$ sed -n '/^BUF/{N;p}' file 
BUFFER i1 (.I(a1), 
    .O(b1)); 
$ 

$ awk 'BEGIN {RS=""} /BUF/' file 
INV i0 (.I(a0), # not BUF here 
    .O(b0)); 
    BUF i1 (.I(a1), 
    .O(b1)); 
BUFFER i1 (.I(a1), 
    .O(b1)); 
$ 

$ grep -Poz 'BUF[^;]+;' file 
BUF here 
    .O(b0));BUF i1 (.I(a1), 
    .O(b1));BUFFER i1 (.I(a1), 
    .O(b1));$ 
$ 

$ grep "BUF " -A1 file 
INV i0 (.I(a0), # not BUF here 
    .O(b0)); 
-- 
    BUF i1 (.I(a1), 
    .O(b1)); 
$