使用bash复制特定上下文中的部分行

时间:2012-05-09 05:02:54

标签: bash text

  

可能重复:
  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行开始,我想忽略。

2 个答案:

答案 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-

在写出文件之前。