次のようなデータを含むファイルがあります。
report aaaaaaaa
- ..
-th bbbbbbbbb
-to ccccccccc
.. --.
質問:次の文字列で始まらない行を削除したい:
report
-th
-to
つまり、欲望の出力により、中間の不要なドットとハッシュがすべて削除され、次のようになります。
report aaaaaaaa
-th bbbbbbbbb
-to ccccccccc
sed
/awk
/grep
/etc機能するソリューション。
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
と呼ばれる元のバックアップを作成します。
サイドノート
私の意図を誤解したり、これに腹を立てたりしないでください。しかし、類似の正規表現/テキスト処理関連の質問がたくさんあることに気付きました。 sed
、awk
、grep
を独力で学び、生産性を向上させることをお勧めします。繰り返しになりますが、誤解しないでください。私はとても喜んでお手伝いします(この辺りのほとんどの人と同じです)。日常的に使用するためにこれらのツールを入手することで、大きな利益が得られると私が思うだけです。
周りの人々がどれほど親切であるかを証明するために、以下のコメントで@slmの提案を検討し、いつでも このチャットルーム に気軽に質問してください。
これには単純なgrepを使用できます。
$ grep -e '^report\|^-th\|^-to' filename
awk
の使用:
awk '/^report|^-t[ho]/' file
sed
の使用:
sed -n -e '/^report\|^-th\|^-to/p' filename
質問者は2つの点を指摘しました。
現時点では、ソリューションは最初のポイントに対処し、それにより2番目のポイントにも対処します。しかし、ファイルが大きく、次のようになっているとします。
report aaaaaaaa
- ..
-th bbbbbbbbb
-to ccccccccc
anything else
.. --.
-tp ddd
-tq eee
- -----
OPの2番目のポイントに対処する必要はありませんか?
sed -r -i.bak '/^[ |.|-]*$/d' input-file
スペース、ドット、ダッシュだけが含まれていると思われる不要な行を削除し、残りを保持します。
どちらのアプローチのリスクも、ファイルの性質が適切に定義されていないことだと思います。
Perlの使用:
Perl -ne 'print if /^report|^-t[ho]/' filename > newfile
または、その場で編集するには(sed
のように、Perl
も一時的なバックアップを作成するため、これは当てはまりませんその場編集):
Perl -i.bak -ne 'print if /^report|^-t[ho]/' filename
これにより、filename.bak
という元のファイルのコピーが作成され、元のファイルが編集されたバージョンで上書きされます。