次の形式のファイルがあります。
_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
_
しかし、元のファイルを書き換える必要があり、続行する方法がわかりません。
GNU sed
:
sed '/binaries=(/,/)/{
//!d
/)/e uname
}'
uname
をコマンドに置き換えます。
私はそれを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
。