sedモードと複数行の交換

sedモードと複数行の交換

テキストファイルを解析して特定の部分を置き換える必要があります。私は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インライン編集の前に元のファイルのバックアップを作成します。
  • :aa再度移動するラベルを作成します。
  • Nパターン空間に次の入力行を追加します。
  • $!最後の行だけじゃなかったら…
    • baラベルに戻るa
  • s///gパターンの検索と置換

より簡単な解決策perl

perl -0777 -i.bak -pe "s/set cells \{.*\}/set cells{\n$cell_variable\n}/igs" file
  • -0777Perlがファイル全体を飲み込むようにします。
  • -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}/:すべてを独自のセル設定コマンドに置き換えます。この時点で{.*}を含む文全体を読む必要があります。

助けてくれてありがとう

関連情報