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


10

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

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.

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

report  
-th  
-to

つまり、desired出力は、これらの中間の不要なドットとハッシュをすべて削除し、次のようになります。

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc

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

回答:


15

を使用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の提案を検討し、いつでもこのチャットルームに気軽に立ち寄って質問してください。


1
正規表現が不必要に不可解なようです。実際に3つのオプションを明示的にリストした場合よりも多くの文字を使用すると思います。
nispio 2013年

1
@nispio知っていますが、問題のファイルが大きい場合はより効率的です。
ジョセフR.

面白い。私は長さや読みやすさの観点から正規表現を常に測定してきました。実行速度についてあまり考えたことはありません。どれが速いかを判断するためにそれらがどのように評価されるかについては十分にわかっていないと思いますが、それも実装固有であると思いますよね?
nispio 2013年

3
ジョセフが喜んで助けてくれると言ったことを繰り返しますが、Q&Aスタイルに当てはまらない一般的な質問がある場合は、いつでもこのサイトのチャットルームでチャットしてみることができます。chat.stackexchange.com/rooms/26/unix-and-linux。私たちの何人かはそこに住んでいます8
slm

@slmありがとうございます。回答に追加します。
ジョセフR.


2

使用sed

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

これはそれほどの節約にはなりませんが、-th/と-toを組み合わせることができます-t[ho]
ケビン

1
@ケビンそれは本当だ。ジョセフ・Rとの私のコメントを彼の答えへのコメントで見てください。
nispio 2013年

2

使用awk

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

これはそれほどの節約にはなりませんが、-th/と-toを組み合わせることができます-t[ho]
ケビン

1

質問者は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 

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


0

Perlの使用:

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.