複数のファイルを含むフォルダがあります。各ファイルにはその単語が複数回表示されること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 に基づくすべてが可能です。
概念的には、ソリューションは次のロジックに従う必要があると思います。
- マッチ
use output
- 行を削除して内容を保持します。
- 検索方向を逆にして最初に表示される項目を見つけます。
implicit
- 一致する場合は、
use output
上記のimplicit
行を追加します。 - もう一度検索方向を逆にして検索に戻ります。
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 ;