web-dev-qa-db-ja.com

与えられたパターンのセットから、パターンで始まらない行を削除します

次のようなデータを含むファイルがあります。

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.

質問:次の文字列で始まらない行を削除したい:

report  
-th  
-to

つまり、欲望の出力により、中間の不要なドットとハッシュがすべて削除され、次のようになります。

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc

sed/awk/grep/etc機能するソリューション。

10
Rana Khan

sedを使用してファイルを適切に変更します。

sed -i '/^\(report\|-t\(h\|o\)\)/!d' your_file

これは、パターンに一致しないすべての行を削除するようにsedに指示します。パターン自体は^(行の先頭)で、その後にreportまたは-tが続き、その後にhまたはoが続きます。

これは実際のインプレース変更ではないことに注意してください。sedは一時的なバックアップコピーを作成し、元のファイルを上書きします。

sedに元のファイルのバックアップコピーを保持したい場合(ファイルに重要なデータが含まれている場合は、これが適切な場合があります)、-iスイッチに拡張子を付けて、バックアップファイルを作成します。

sed -i'.bak' -e '/^\(report\|-t\(h\|o\)\)/!d' your_file

your_fileを変更し、your_file.bakと呼ばれる元のバックアップを作成します。

サイドノート

私の意図を誤解したり、これに腹を立てたりしないでください。しかし、類似の正規表現/テキスト処理関連の質問がたくさんあることに気付きました。 sedawkgrepを独力で学び、生産性を向上させることをお勧めします。繰り返しになりますが、誤解しないでください。私はとても喜んでお手伝いします(この辺りのほとんどの人と同じです)。日常的に使用するためにこれらのツールを入手することで、大きな利益が得られると私が思うだけです。

周りの人々がどれほど親切であるかを証明するために、以下のコメントで@slmの提案を検討し、いつでも このチャットルーム に気軽に質問してください。

15
Joseph R.

これには単純なgrepを使用できます。

$ grep -e '^report\|^-th\|^-to' filename
10
pradeepchhetri

awkの使用:

awk '/^report|^-t[ho]/' file
2
jasonwryan

sedの使用:

sed -n -e '/^report\|^-th\|^-to/p' filename
2
nispio

質問者は2つの点を指摘しました。

  • 「report」、「-th」、「-to」で始まらない行を削除したい。
  • 必要な出力は、「それらすべての中間の不要なドットとハッシュ(原文のまま)」を削除する必要があります。

現時点では、ソリューションは最初のポイントに対処し、それにより2番目のポイントにも対処します。しかし、ファイルが大きく、次のようになっているとします。

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc
anything else
.. --.
-tp ddd
-tq eee
     -  -----

OPの2番目のポイントに対処する必要はありませんか?

sed -r -i.bak '/^[ |.|-]*$/d' input-file 

スペース、ドット、ダッシュだけが含まれていると思われる不要な行を削除し、残りを保持します。
どちらのアプローチのリスクも、ファイルの性質が適切に定義されていないことだと思います。

1
user15760

Perlの使用:

Perl -ne 'print if /^report|^-t[ho]/' filename > newfile

または、その場で編集するには(sedのように、Perlも一時的なバックアップを作成するため、これは当てはまりませんその場編集):

Perl -i.bak -ne 'print if /^report|^-t[ho]/' filename

これにより、filename.bakという元のファイルのコピーが作成され、元のファイルが編集されたバージョンで上書きされます。

0
terdon