我有一个包含这样内容的文件。
if {[CELL NAME "CELL1"]} {
define_cell \
-pinlist { i0 i1 i2 0 } \
CELL1
}
if {[CELL NAME "CELL2"]} {
define_cell \
-pinlist { i0 i1 i2 0 } \
CELL2
}
define_cell \
-pinlist { i0 i1 i2 0 } \
CELL3
define_cell \
-pinlist { i0 i1 i2 0 } \
CELL4
我想尝试这样的小节。
define_cell \
-pinlist { i0 i1 i2 0 } \
CELL3
当我尝试使用下面的简单脚本时,我实际上是从define_cell的第一个匹配到文件的结尾,这与我的期望相反。
awk '/define_cell/,/CELL3/{print $0}' <FILE>
我如何实现特定目标。我试图遵循这个建议的解决方案。 awk find the last match and print the next N lines 但是无法让它发挥作用。
答案 0 :(得分:2)
使用GNU awk这样的东西可能会起作用:
awk '{$0=RT$0}/CELL3/' ORS= RS=define_cell input.txt
以上内容将在define_cell
上拆分记录,然后打印包含CELL3
的记录。
备选方案您可以使用以下内容存储要在r
中打印的每一行,并在每次define_cell
匹配时将其删除:
awk '/define_cell/ { l=1; delete r}
l { r[l++]=$0 }
/CELL3/ { for(i=1;i<l;i++) print r[i] }' input.txt
您还可以使用tac
从后面读取文件:
tac input.txt | awk '/CELL3/,/define_cell/' | tac
答案 1 :(得分:0)
使用grep
简单回答:
grep -A 2 "^define_cell" input.txt | grep -B 2 "CELL3"
使用-A 2
在第一次匹配后提取两行,并使用-B 2
在最后一次匹配之前提取两行,这就是两种匹配方式。