行の先頭から他の行の最後の2番目のパターンまで、複数のパターンの1つに置き換えます

行の先頭から他の行の最後の2番目のパターンまで、複数のパターンの1つに置き換えます

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

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. パターンリストの1つ(blahまたは)と一致しますyada
  2. /*次に、一致する行の先頭に希望のテキスト()を追加し、
  3. そして、他のテキスト(*/)を他のパターンと一致する次の行の末尾に追加します()。);ここで一致する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スクリプトを中断し、:$タグに分岐します。失敗した場合は、branchコマンドでジャンプせずに分岐のみを行い、一致する^\$まで入力を自動的に印刷します。

一致すると、から始まりから終わる閉ループに入るため、:$ループが完了するまでb$最初の置換を再試行しません。s///ループの終わりに成功した置換の一致がsed t推定され、成功するとスクリプトから分岐し、次の入力行(ある場合)を使用して最初からループを再開します。実行する前に自動的に繰り返し印刷し、繰り返しごとに外部入力ラインでパターンスペースを上書きするため、不必要にバッファリングされません。);$s///n

おすすめ記事