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

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

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

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.

問題:次の文字列で始まらない行を削除したいと思います。

report  
-th  
-to

これは、目的の出力が不要な中間点とハッシュの両方を削除し、次のように表示されることを意味します。

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc

sed///その他awkgrep可能な解決策。

答え1

sedファイルの内部修正の使用:

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

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

これは実際の内部修正ではないことに注意してください。sed一時バックアップコピーが作成され、元のファイルがそのコピーで上書きされます。

ソースファイルのバックアップコピーを保持するにはsed(ファイルに機密データが含まれている場合は良い方法かもしれません)、スイッチにバックアップ-iファイルを作成するための拡張子を指定してください。

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

your_file名前付き元のバックアップが変更されて作成されますyour_file.bak

メモ

私の意図を誤解したり怒ったりしないでください。しかし、同様の正規表現/テキスト処理に関する質問がたくさんあることがわかりました。私はあなたが学習を始め、生産性を高めるのを助けるために自分自身にsed頼ることを提案します。もう一度申し上げますが、誤解しないでください。私は喜んで助けます(ここにいるほとんどの人も同じです)。日常の使用のためにこれらのツールを選択すると、大きな利点を得ることができると思います。awkgrep

ここで人々がどのように役立つかを証明するために、以下のコメントにある@slmのアドバイスを検討し、いつでも立ち寄ってください。このチャットルーム自由に質問してください。

答え2

簡単なgrepを使用してこれを達成できます。

grep -E '^(report|-th|-to)' filename

またはより短く、

grep -E '^(report|-t[ho])' filename

答え3

使用awk:

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

答え4

パールの使用:

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

または内部編集(たとえばsedperl一時バックアップも実行されるため、実際にはそうではありません)所定の位置に編集する):

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

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

関連情報