テキストファイルを解析して特定の部分を置き換える必要があります。私はsed
これがそうする方法だと思いますが、複数の行を処理する方法がわかりません。
私が探しているパターンは
set cells { \
cell1 \
cell2 \
cell3 \
}
変数の内容に置き換えたいです。
以下はトリックを実行する必要がありますが、複数行では機能しません。どんなアイデアがありますか?
sed "s/set cells {.*}/set cells {$cell_variable}/" file
答え1
次の場合sed
:
sed -i.bak ':a;N;$!ba;s/set cells {.*}/set cells{\n'$cell_variable'\n}/g' file
-i.bak
インライン編集の前に元のファイルのバックアップを作成します。:a
a
再度移動するラベルを作成します。N
パターン空間に次の入力行を追加します。$!
最後の行だけじゃなかったら…ba
ラベルに戻るa
s///g
パターンの検索と置換
より簡単な解決策perl
:
perl -0777 -i.bak -pe "s/set cells \{.*\}/set cells{\n$cell_variable\n}/igs" file
-0777
Perlがファイル全体を飲み込むようにします。-i.bak
インライン編集の前に元のファイルのバックアップを作成します。
答え2
Perlを追加のツールとして使用するのを避けたいです。何らかの理由でカオスの解決策はうまくいきませんでしたが、sedでいくつかの内容を読んだ後、代わりに考えました。
sed "/set cells/!b; :Loop; N; /}/!b Loop; s/.*/set cells {$cell_def}/" -i file
/set cells/!b
:設定されたセルを見つけ、見つからない場合は次の行に移動:Loop
: 複数行をマージするために使用されるラベルN
: 次の行を追加/}/!b Loop
:Search}が見つからない場合は、Loopラベルを返します。効果的に、ループは}が見つかるまで新しい行を読み取ります。s/.*/set cells {$cell_def}/
:すべてを独自のセル設定コマンドに置き換えます。この時点で{.*}を含む文全体を読む必要があります。
助けてくれてありがとう