0

重複の可能性:
bashスクリプトを使用して、特定の行を検索し、その行内の特定のコンテンツをコピーする

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無視したいと思います。

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

私の答えのアプローチは機能しますが、@tripleeeの答え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-

ファイルに書き出す前に。

于 2012-05-09T06:19:37.727 に答える