例如,网表是:
INV i0 (.I(a0),
.O(b0));
BUF i1 (.I(a1),
.O(b1));
我想从网表中提取BUF单元格并写入另一个文件。 如您所知,网表的单元格中总是有换行符,找到要提取的单元格的正则表达式格式是什么?
我已经尝试了grep ^BUF.*$
但它只会返回BUF i1 (.I(a1),
,因为有换行符,我无法提取整个BUF单元格。
答案 0 :(得分: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 :(得分:1)
使用sed:
sed -n '/^BUF/{N;p}' file
找到^BUF
后,该行与下一行(N
)合并并输出(p
)。
答案 2 :(得分:0)
grep oneliner
grep "BUF " -A1 input >> output
对于每个BUF
匹配,打印匹配的行和后面的一行。
输出文件:
BUF i1 (.I(a1),
.O(b1));
答案 3 :(得分: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));
$