可能重复:
To Find a Particular line and copying a specific content within the line using bash scripting
我有一个文件system.mss
,其中包含如下信息块:
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
我想将PARAMETER C_HIGHADDR
的值复制到另一个文件中,但仅限于此类块;该文件中还有其他块,从不同的BEGIN
行开始,我想忽略。
答案 0 :(得分:2)
这就是
grep
的用途
实际上,不,这就是sed
的用途。更具体地说,sed
的范围寻址模式非常适合这种类型的问题。
sed -n '/BEGIN lmb_bram_if_cntrl/,/END/s/PARAMETER C_HIGHADDR = //p' system.mss
意思是,在以第一个正则表达式开头并以最后一个结尾的行的范围内,执行以下操作;如果找到PARAMETER C_HIGHADDR =
,请将其删除并打印该行。
答案 1 :(得分:1)
虽然我的答案中的方法有效,但更好的方法是按@tripleee’s answer使用sed
。
这就是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-
在写出文件之前。