複数のファイルを含むフォルダがあります。各ファイルにはその単語が複数回表示されること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 ;
答え2
ユーティリティが存在しない場合でも、その操作をtac
実行できますが、sed
「出力を使用」行が表示されるまで印刷できません。その前に他の「暗黙的」行が現れることがわかりません。
sed -n '
/implicit/!bp
h
:loop
${g;bp;}
n
/implicit/{x;p;bloop;}
H
/use output/!bloop
G;s/\n[^\n]*$//
:p;p
' file