特定の文字列の前のすべてのテキストを削除する方法

特定の文字列の前のすべてのテキストを削除する方法

私は最近この解決策を見つけましたが、常に日付と時刻を含むコマンドを使用していたので効果がありました。つまり、私の場合、文字列はほぼ常に一意です。

sed -n -i '/some_string_here/,$p' file_here

ただし、最近は他の種類の文字列(日付と時刻を除く)を使用する必要があります。

問題は、このソリューションが最初の発生でのみ機能することです。

[oracle@server1 ~]$ cat arquivo
OPERATIONAL SYSTEMS:
Windows
MAC OS
OPERATIONAL SYSTEMS TOMORROW:
Linux
Xubunto
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

[oracle@server1 ~]$ sed -n -i '/OPERATIONAL SYSTEMS TOMORROW:/,$p' arquivo
[oracle@server1 ~]$ cat arquivo
OPERATIONAL SYSTEMS TOMORROW:
Linux
Xubunto
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

最後の項目から最後の項目まで内容を印刷するには、次の作業を行う必要がありますOPERATIONAL SYSTEMS TOMORROW:

[oracle@server1 ~]$ cat arquivo
OPERATIONAL SYSTEMS:
Windows
MAC OS
OPERATIONAL SYSTEMS TOMORROW:
Linux
Xubunto
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

[oracle@server1 ~]$ sed -n -i 'some command for it' arquivo
[oracle@server1 ~]$ cat arquivo
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

どうすればいいですか?

答え1

これは次のとおりですsed

sed -n 'H; /^OPERATIONAL SYSTEMS TOMORROW:/h; ${g;p;}' arquivo

出力:

OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

ファイルをその場で編集するには:

sed -i -n 'H; /^OPERATIONAL SYSTEMS TOMORROW:/h; ${g;p;}' arquivo

答え2

ファイルの行の順序を変更してインポートします。最初数行を入力してもう一度置き換えます。

$ tac file | sed '/OPERATIONAL SYSTEMS TOMORROW:/q' | tac
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

これではないかもしれません。効率的なしかし、簡単なので、理解し、維持するのは簡単です。

このtacユーティリティはGNU coreutilsの一部です。

答え3

通常のshを使用してこれを行うことができます。

${VAR%%string}

ここで、$ VARには処理したいテキストが含まれています。

答え4

Perlの使用(awkとsedよりも高速):

$ cat temp.txt
OPERATIONAL SYSTEMS:
Windows
MAC OS
OPERATIONAL SYSTEMS TOMORROW:
Linux
Xubunto
Extra
OPERATIONAL SYSTEMS:
Windows
MAC OS
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS  

実装する:

$ perl -ne ' {
  if ( $_ =~ /(OPERATIONAL SYSTEMS TOMORROW:)/ ) {$found=1;$index=0;}
  if($found ) {$index++; $a[$index]=$_;} $last_index=$index;}
  END {
  for($i=1;$i<=$index;$i++){ print $a[$i];}
  } ' temp.txt

関連情報