別の行で始まり終わるパターンを置き換える

別の行で始まり終わるパターンを置き換える

次の形式のファイルがあります。

Whatever1
Whatever2
Whatever3
binaries=(
text1
bin2
ohhh3
)
Whatever4
Whatever5
Whatever6

binaries=(内部ラインをコマンド出力に置き換える必要があります。)

次のコマンドを使用して、次のブロックを選択できますsed -n -e '/binaries=(/,/)/p' filename

binaries=(
text1
bin2
ohhh3
)

または、次の使用をお勧めしますawk '/binaries/,/)/{if(!/binaries|)/)print}' filename

text1
bin2
ohhh3

しかし、元のファイルを再構築する必要がありますが、どのように進むべきかわかりません。

答え1

GNUの使用sed:

sed '/binaries=(/,/)/{
       //!d
       /)/e uname
     }'

あなたのコマンドに置き換えてくださいuname

答え2

たとえば、次のように awk を使用します。

awk '
  f && /)/ { f=0 }
  !f
  !f && /binaries=\(/ { f=1 ; p=1 }
  p { system ("your_command") ; p=0 }
'

ここで、「your_command」は置換を定義します。

説明:このフラグはfステートマシンを制御します。設定されている場合は、交換する必要があるブロックにあります。開始パターンと終了パターンが一致すると、それに応じてフラグが変更されます。ブロック内にある間、システムコールが実行されます。このフラグはp一度だけ印刷するために使用されます。

元のファイルを置き換えるには、新しいファイルを作成して元のファイルを上書きするか、awk最新バージョンのGNUをオプションと一緒に使用します-i inplace

関連情報