web-dev-qa-db-ja.com

異なる行で開始および終了するパターン間で置換

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

_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
_

しかし、元のファイルを書き換える必要があり、続行する方法がわかりません。

3
jherran

GNU sed

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

unameをコマンドに置き換えます。

4

私はそれをawkで行います、例:

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

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

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

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

3
Janis