次のデータを含むファイルがあります。
report aaaaaaaa
- ..
-th bbbbbbbbb
-to ccccccccc
.. --.
問題:次の文字列で始まらない行を削除したいと思います。
report
-th
-to
これは、目的の出力が不要な中間点とハッシュの両方を削除し、次のように表示されることを意味します。
report aaaaaaaa
-th bbbbbbbbb
-to ccccccccc
sed
///その他awk
のgrep
可能な解決策。
答え1
sed
ファイルの内部修正の使用:
sed -i '/^\(report\|-t\(h\|o\)\)/!d' your_file
sed
パターンと一致しないすべての行を削除するように指示します。パターン自体は^
(行の先頭)で、その後にorが続き、report
その後-t
にh
orが続きますo
。
これは実際の内部修正ではないことに注意してください。sed
一時バックアップコピーが作成され、元のファイルがそのコピーで上書きされます。
ソースファイルのバックアップコピーを保持するにはsed
(ファイルに機密データが含まれている場合は良い方法かもしれません)、スイッチにバックアップ-i
ファイルを作成するための拡張子を指定してください。
sed -i'.bak' -e '/^\(report\|-t\(h\|o\)\)/!d' your_file
your_file
名前付き元のバックアップが変更されて作成されますyour_file.bak
。
メモ
私の意図を誤解したり怒ったりしないでください。しかし、同様の正規表現/テキスト処理に関する質問がたくさんあることがわかりました。私はあなたが学習を始め、生産性を高めるのを助けるために自分自身にsed
頼ることを提案します。もう一度申し上げますが、誤解しないでください。私は喜んで助けます(ここにいるほとんどの人も同じです)。日常の使用のためにこれらのツールを選択すると、大きな利点を得ることができると思います。awk
grep
ここで人々がどのように役立つかを証明するために、以下のコメントにある@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
または内部編集(たとえばsed
、perl
一時バックアップも実行されるため、実際にはそうではありません)所定の位置に編集する):
perl -i.bak -ne 'print if /^report|^-t[ho]/' filename
これにより、元のファイルのコピーが作成され、filename.bak
編集されたバージョンで元のファイルが上書きされます。