次のファイルがあります。
data data data
$globaltext blah gibberjabber
somemorestuff etc
);
data data data
$otherjunk yada gibberish
etc etc
more etc
);
私が望む結果は次のファイルです。
data data data
/*$globaltext blah gibberjabber
somemorestuff etc
);*/
data data data
/*$otherjunk yada gibberish
etc etc
more etc
);*/
forループを使用してこれを行う方法を知っていますが、これを達成するには、次のように1行のsed
コマンドを使用したいと思います。sed
sed '/blah\|yada/s/^\(\$.*)\;\)/\/\*\1\*\//' filename
先頭のパターンマッチングは検索を1行に制限するため、明らかに上記のコマンドは失敗します。しかし、この概念はまさに私が望むものです。
- パターンリストの1つ(
blah
または)と一致しますyada
。 /*
次に、一致する行の先頭に希望のテキスト()を追加し、- そして、他のテキスト(
*/
)を他のパターンと一致する次の行の末尾に追加します()。);
ここで一致する2つの項目は異なる行数を持ちます(常に2行ずつ離れているわけではありません)。
これは可能ですか、またはforループまたはより良いものを使用する必要がありますか?
私はシェルスクリプトに初めて触れるので、主に学習が必要です。
ベストアンサー1
sed -e's|^\$|/*&|;t$' -eb -e:$ -e'### handle top end of loop' \
-e's|);$|&*/|;t' -en -eb$ -e'### handle the bottom end'
data data data
/*$globaltext blah gibberjabber
somemorestuff etc
);*/
data data data
/*$otherjunk yada gibberish
etc etc
more etc
);*/
s///
試行された交換がすべてt
適用されました。最初のケースで交換が成功したsed
場合いいえ最終的にb
スクリプトを中断し、:$
タグに分岐します。失敗した場合は、b
ranchコマンドでジャンプせずに分岐のみを行い、一致する^\$
まで入力を自動的に印刷します。
一致すると、から始まりから終わる閉ループに入るため、:$
ループが完了するまでb$
最初の置換を再試行しません。s///
ループの終わりに成功した置換の一致がsed
t
推定され、成功するとスクリプトから分岐し、次の入力行(ある場合)を使用して最初からループを再開します。実行する前に自動的に繰り返し印刷し、繰り返しごとに外部入力ラインでパターンスペースを上書きするため、不必要にバッファリングされません。);$
s///
n