例如,網表是:提取特定的細胞從網表
INV i0 (.I(a0),
.O(b0));
BUF i1 (.I(a1),
.O(b1));
我想從網表提取BUF細胞並寫入另一個文件。 正如你所知道的,網表的一個單元格內總是存在換行符,那麼查找我想要提取的單元格的正則表達式格式是什麼?
我試過grep ^BUF.*$
但它只會返回BUF i1 (.I(a1),
,因爲有一個換行符,我沒有提取整個BUF單元格。
例如,網表是:提取特定的細胞從網表
INV i0 (.I(a0),
.O(b0));
BUF i1 (.I(a1),
.O(b1));
我想從網表提取BUF細胞並寫入另一個文件。 正如你所知道的,網表的一個單元格內總是存在換行符,那麼查找我想要提取的單元格的正則表達式格式是什麼?
我試過grep ^BUF.*$
但它只會返回BUF i1 (.I(a1),
,因爲有一個換行符,我沒有提取整個BUF單元格。
的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.`
您應該提到awk解決方案僅適用於GNU awk,原因是多字符RS。對於他們在任何awk中改變'RS =「\ n \ n」'到'RS =「」'。而且,在awk'/ BUF/{print $ 0}中''通常寫成只是'/ BUF /',因爲'{print $ 0}'是給定真實條件的默認動作。如果您可以輸出多個記錄,則還應該設置ORS =「\ n \ n」'以匹配輸入的空行分隔格式。 –
您應該提到'RS =「」'會導致輸入數據文件中的前導換行被忽略,並且如果文件在最後一條記錄後沒有多餘的空行結束,則最後的換行符將從記錄中刪除。 Ergo:這是+1。明確的印刷應該去,我同意。 'ORS =「\ n \ n」'加法是一個假設。 –
如果在文件開始時有任何完全空行,那麼是的,他們會被忽略,但a)他們爲什麼會在那裏和b)如果他們是那麼爲什麼不應該忽略它們?c)段落的行爲模式已經有很好的文檔記錄,並且與使用默認FS時忽略記錄中的前導空白的方式一致 - 每次使用時都不需要描述。以空行結尾的文件不會導致最終的換行符被刪除。是的,我們必須假設OP是否希望在輸出記錄之間插入新行,例如在他的輸入中。 –
隨着SED:
sed -n '/^BUF/{N;p}' file
當^BUF
發現,該行合併下一行(N
)和輸出(p
)。
grep的 oneliner
grep "BUF " -A1 input >> output
對於每一個BUF
比賽,打印匹配行和後一行。
輸出文件:
BUF i1 (.I(a1),
.O(b1));
這將任何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));
$
正確解析的Verilog,使用https://metacpan.org/ pod/Verilog-Perl – toolic