为了找到一个特定的行和使用bash脚本在行内复制特定内容 [英] To Find a Particular line and copying a specific content within the line using bash scripting

查看:142
本文介绍了为了找到一个特定的行和使用bash脚本在行内复制特定内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有system.mss一些文件的内容的文件是:

I have a file system.mss some of the contents of the file are :

BEGIN lmb_bram_if_cntlr 结果
Parameter实例= dlmb_cntlr_0 结果
参数HW_VER = 3.00.b 结果
参数C_BASEADDR = 00000000 结果
参数C_HIGHADDR = 0x0003ffff 结果
BUS_INTERFACE SLMB = dlmb_0 结果
BUS_INTERFACE BRAM_PORT = calmb_0_BRAM_PORTA 结果
END

BEGIN lmb_bram_if_cntlr
PARAMETER INSTANCE = dlmb_cntlr_0
PARAMETER HW_VER = 3.00.b
PARAMETER C_BASEADDR = 0x00000000
PARAMETER C_HIGHADDR = 0x0003ffff
BUS_INTERFACE SLMB = dlmb_0
BUS_INTERFACE BRAM_PORT = calmb_0_BRAM_PORTA
END

BEGIN lmb_bram_if_cntlr 结果
Parameter实例= ilmb_cntlr_0 结果
参数HW_VER = 3.00.b 结果
参数C_BASEADDR = 00000000 结果
参数C_HIGHADDR = 0x0003ffff 结果
BUS_INTERFACE SLMB = ilmb_0 结果
BUS_INTERFACE BRAM_PORT = ilmb_cntlr_0_BRAM_PORT 结果
END

BEGIN lmb_bram_if_cntlr
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

BEGIN lmb_bram_if_cntlr 结果
Parameter实例= dlmb_cntlr_1 结果
 参数HW_VER = 3.00.b 结果
 参数C_BASEADDR = 00000000 结果
 参数C_HIGHADDR = 0x0000ffff 结果
  BUS_INTERFACE SLMB = dlmb_1 结果
  BUS_INTERFACE BRAM_PORT = calmb_1_BRAM_PORTA 结果
END

BEGIN lmb_bram_if_cntlr
PARAMETER INSTANCE = dlmb_cntlr_1
PARAMETER HW_VER = 3.00.b
PARAMETER C_BASEADDR = 0x00000000
PARAMETER C_HIGHADDR = 0x0000ffff
BUS_INTERFACE SLMB = dlmb_1
BUS_INTERFACE BRAM_PORT = calmb_1_BRAM_PORTA
END

BEGIN lmb_bram_if_cntlr 结果
Parameter实例= ilmb_cntlr_1 结果
 参数HW_VER = 3.00.b 结果
 参数C_BASEADDR = 00000000 结果
 参数C_HIGHADDR = 0x0000ffff 结果
  BUS_INTERFACE SLMB = ilmb_1 结果
  BUS_INTERFACE BRAM_PORT = ilmb_cntlr_1_BRAM_PORT 结果
END

BEGIN lmb_bram_if_cntlr
PARAMETER INSTANCE = ilmb_cntlr_1
PARAMETER HW_VER = 3.00.b
PARAMETER C_BASEADDR = 0x00000000
PARAMETER C_HIGHADDR = 0x0000ffff
BUS_INTERFACE SLMB = ilmb_1
BUS_INTERFACE BRAM_PORT = ilmb_cntlr_1_BRAM_PORT
END

我想只为参数INSTANCE = ilmb_cntlr_n

I want to copy the 'PARAMETER C_HIGHADDR = (value)' only for ' PARAMETER INSTANCE = ilmb_cntlr_n'

请注意:可以有N的这些内容数量,但我​​想在地址只有ilmb_cntlr复制

Note: There can be 'n' number of such contents but i want to copy the address for only the ilmb_cntlr

我怎样才能做到这一点?

How can i do That?

,一旦地址被复制例如0x0003ffff我希望它被拷贝到0x0003FFB0

and once the address is copied ' for example 0x0003ffff i want it to be copied as 0x0003FFB0'

最后两个FF是由B0替换

the last two ff are replace by B0

和所有其它F'F的被替换成''和地址的其余部分保持相同

and any other 'f's are replaced by 'F' and rest of the address remains same

我怎样才能做到这一点?

How can i do that?

推荐答案

下面是一个bash的解决方案:

Here is a bash solution:

while read line ; do
    if [[ $line =~ ^PARAMETER\ INSTANCE\ =\ ilmb_cntlr_[0-9] ]] ; then
        found=1
    fi
    if [[ $line =~ ^PARAMETER\ C_HIGHADDR\ =\  ]] ; then
        value=$line
    fi
    if [[ $line = '' ]] ; then                      # end of block
        if (($found)) ; then                        # we are interested in the block
            value=${value//f/F}                     # capitalize f's
            echo ${value%FF}B0                      # replace last two characters with B0
        fi
        unset found                                 # reset variables so we can check the next block
        unset value
    fi
done

我宁愿使用Perl像这样的任务,虽然。

I would rather use Perl for a task like this, though.

这篇关于为了找到一个特定的行和使用bash脚本在行内复制特定内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆