複数のexpr2を含むファイルで、expr1と一致する行を上記のexpr2と一致する別の行の前に移動します。

複数のexpr2を含むファイルで、expr1と一致する行を上記のexpr2と一致する別の行の前に移動します。

複数のファイルを含むフォルダがあります。各ファイルにはその単語が複数回表示されることimplicitがあり、一部のファイルには複数行の文が含まれる場合implicitがあります。use output後ろに implicit。一般的に、2行を何行に分けるのかわかりません。一部のサンプルファイルは次のとおりです。

最初の1.f

...some text...

implicit

...some other text...

最初の2.f

...some text...

implicit
...a few lines...
use output

...some other text...

最初の3.f

...some text...

implicit
...a few lines...
use output

...some other text...

implicit
...a few lines...
use output

...some more text...

最初の4.f

...some text...

implicit

...some other text...

implicit
...few lines...
use output

...some more text...

次の項目をすべて移動したいと思います。use output 以上implicit私が以前に見つけたものの中で最も近いものuse output

通常、ソリューションは大文字と小文字を区別する必要があります。 grep、sed、awk に基づくすべてが可能です。

概念的には、ソリューションは次のロジックに従う必要があると思います。

  1. マッチuse output
  2. 行を削除して内容を保持します。
  3. 検索方向を逆にして最初に表示される項目を見つけます。implicit
  4. 一致する場合は、use output上記のimplicit行を追加します。
  5. もう一度検索方向を逆にして検索に戻ります。use output

ベストアンサー1

範囲の問題を逆の順序で見てみると簡単になります。最後に、宇宙の調和を維持するために再び反転することを忘れないでください。

範囲演算子を使用すると、, 正規表現の数は最大化されますが、読みやすさは向上します。

tac file_name |
sed -e '
  /use output/,/implicit/!b
  /use output/{h;d;}
  /implicit/G
'   |   
tac ;

範囲演算子に頼る必要はありません。コードの複雑さを犠牲にして正規表現の数を最小限に抑えます。

tac  file |
sed -e '
  /use output/!b
  $q;h;N;s/.*\n//
  :loop
    n
  /implicit/!bloop
  G
'    |
tac  ;

おすすめ記事