0

Possible Duplicate:
To Find a Particular line and copying a specific content within the line using bash scripting

I have a file system.mss which contains blocks of information like this one:

BEGIN lmb_bram_if_ctnlr
PARAMETER INSTANCE = ilmb_cntlr_0
PARAMETER HW_VER = 3.00.b
PARAMETER C_BASEADDR = 0x00000000
PARAMETER C_HIGHADDR = 0x0003ffff
BUS_INTERFACE SLMB = ilmb_0
BUS_INTERFACE BRAM_PORT = ilmb_cntlr_0_BRAM_PORT
END

I want to copy the value for PARAMETER C_HIGHADDR into another file, but only for this kind of block; there are other blocks in the file, starting with different BEGIN lines, I want to ignore.

4

2 回答 2

2

这就是grep为了

实际上,不,那sed是为了。更具体地说,范围寻址模式sed非常适合这种类型的问题。

sed -n '/BEGIN lmb_bram_if_cntrl/,/END/s/PARAMETER C_HIGHADDR = //p' system.mss

意思是,在从第一个正则表达式开始到最后一个正则表达式结束的一系列行中,执行以下操作;如果PARAMETER C_HIGHADDR =找到,将其删除并打印该行。

于 2012-05-09T08:02:15.277 回答
1

尽管我的答案中的方法有效,但更好的方法是sed按照@tripleee 的答案使用。

这就是grep目的。要仅获取总长度为 8 行的PARAMETER C_HIGHADDR内部块的值,请执行以下操作:BEGIN lmb_bram_if_cntrl

grep 'BEGIN lmb_bram_if_cntrl' -A 7 "path/to/system.mss" | grep 'PARAMETER C_HIGHADDR' | cut -d = -f 2- > "path/to/outfile"

outfile将按照它们被发现的顺序写入值,即

0x0003ffff
0x0000ffff

– 注意每一行都会有一个前导空格。如果这让您感到困扰,请添加

| cut -c 2-

在写出文件之前。

于 2012-05-09T06:19:37.727 回答