2017-05-28 5 views
0

内の文字列の最後のインスタンスが、それでは、私は、次のテキストを含むファイル持っているとしましょう後にすべてのテキストを削除します。Unixの

string1 
string1 
string2 
string1 
string2 
string1 
string1 

をそして、私は "の最後に出現した後に、すべてのテキストを取り除くたかったです文字列2 "。たとえば、出力は次のようになります。

string1 
string1 
string2 
string1 
string2 

bashでこれを行う簡単な方法は何ですか?

答えて

1
tac file | awk '!f && /string2/ { f=1 }; f' | tac 

tacファイルを上下逆に印刷します。 awkは、パターンstring2(元のバージョンで最後に発生したもの)の最初の発生時にフラグを設定し、フラグが設定されている場合にのみ行を出力します。

+0

ありがとう、あなたは私の一日を作った! – ParadigmTheGreat

2

のgrepアプローチ:

grep -zo '.*string2' yourfile && echo 

出力:

string1 
string1 
string2 
string1 
string2 

-z - ラインのシーケンスとして入力および出力データ、ゼロバイトで終了毎の治療( ASCII NUL文字)改行の代わりに


ファイルに結果を書き込むには、次のアクションを実行します。

(grep -zo '.*string2' yourfile && echo "") > output.txt 
+0

@ ParadigmTheGreat、私の更新を参照してください – RomanPerekhrest

+0

なぜ私のために働かないのですか? 'string2'で2行しか得られません。 – steffen

+0

@steffen、あなたのOSと 'grep'バージョンは何ですか? – RomanPerekhrest

0

さて、ここでは簡単なgrepです:

grep -B100000000 string2 yourfile 

だけの行数よりもその数は大きくしますあなたのファイル。