ファイルを「cat」してコメント行を削除するにはどうすればよいですか?


29

のようにcatファイルを作成php.iniし、すべての行を削除する方法があるかどうかを知りたい;

たとえば、ファイルに次が含まれている場合:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

そして、私は正しいコマンドを実行しました、そして私は次のようになりますcat | {remove comments command}

error_reporting  =  E_ALL & ~E_NOTICE

-私は想定しcat、これを行うための最善の方法だろうが、私のような別のユーティリティを使用して答えを実際に大丈夫だよawksedegrep、など


のようなものはerror_reporting = E_ALL & E_NOTICE ; Show all errors, except for noticesどうですか?その場合もコメントを削除する必要がありますか?
CVn

@MichaelKjörling -私は削除されたコメントで始まる行だけで本当に大丈夫だよ
CWD

1
catファイルを連結するツールです。grepパターンに基づいてラインをフィルタリングするツールです。sedそしてawkまた、これらの行を変更することができます。
ステファンシャゼル

回答:



25

grepを介してファイルをパイプする必要はありません。grepはコマンドライン引数としてファイル名を取ります。

grep -v '^#' file1 file2 file3

#charで始まる行を除くすべての行を出力します。コメント文字を任意に変更できます。

複数のコメント文字がある場合(行の先頭にあると想定)

egrep -v '^(;|#|//)' filelist

2
私がいつもしがみついたもう1つのことはgrep '^[^;]' filename。しかし、その移植性について話すことはできません!
ジョディC

@JodieCは移植性がありますが、空の行も削除します(多くの場合、これが望ましい)。の標準的な同等物はegrepですgrep -E。一つは、また、使用することができますgrep -ve '^[;#]' -e '^//'
ステファンChazelas

9

egrepの使用を節約できますcat。言い換えれば、作成するプロセスの数を減らし(egrepvs cat+ egrep)、使用するバッファーを少なくします(パイプからcatto egrep、パイプなし)。

通常、catファイルをそれ自体で読み取ることができるコマンドに単に渡したい場合は、使用を制限することをお勧めします。

これにより、次のコマンドは、スペースやタブでインデントされている場合でもコメントを削除します。

egrep -v '^ [[:blank:]] *;' file.ini

おもしろいのは、新しい[[ 文字クラスの ]]正規表現形式と、egrep少なくとも10年ほどは非推奨のコマンドの使用を組み合わせたことです。
mikeserv 14年

興味深い... gnu.org/software/grep/manual/html_node/にある現在のドキュメントには、POSIXクラスが含まれています。
ジャックワシー

7
egrep -v '^;|^$' $file

「;」で始まる行と空の行は除外されます。

正規表現で^は、行の始まりと行$の終わりを示します。したがって、行^$の開始文字と行の終了文字が互いに隣り合う行を指定します。


この権利を読んでいる場合、コメント行を削除できますが、空白行も削除できますか?
cwd

1
@cwdはい。私は彼が両方を含め、なぜわからないんだけど、あなただけのコメント行を削除したい場合は、単に使用egrep -v '^;'
マイケルMrozek

4
egrepはファイルも好きです(使用されるプロセスとバッファが少なくなります)。インデントされたコメントも削除することで少しボーナスが得られます:egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
「無駄な猫の使用」バッジが必要です。
サイモンリヒター

@nrolans-人気のあるコメントのように見えますが、答えにしてはどうですか?
cwd

2

簡単なawkワンライナーawk '/^;/{next}1' input_fileでトリックを行う必要があります。

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 

3
正しいが、冗長。ちょうどawk '!/^;/' input_file十分です。
マナトワーク

2

Jaypalと同様に、私もawkこれらの目的に使用するでしょう。perlはそのような目的のために時々非常に便利であることを言及するのは悪いことです:

cat data.txt | perl -lne "print unless /^;/"

Perlの正規表現はawkの正規表現と比較してより強力であり、必要な場合もあります。


perlに関する+1、猫および-Lの両方が重複しているので、簡単な呼び出しがあるもののperl -ne 'print unless /^;/' data.txt
サイモンウィテカー

@Simone Whitaker、はい、あなたは正しいです-私が書く方法でそれを書くことはただの習慣であり、それを言及する価値があります。
shabunc

1
確実なこと。実際、catこれらの例では、より一般的な「STDOUTでテキストを生成するもの」のプロキシと見なすとうまく機能すると思います。スライスしたパン、私見以来、Unixパイプは最高のものです。:)
サイモンウィテカー

2

@shabuncの答えの詳細。これはPerlを使用してコメント(インラインコメントを含む)を取り除き、空白以外を含む行を出力します。

$ perl -ne 's/;.*//; print if /\S/' data.txt

説明:

  • s/;.*//置換演算子(s/<regex>/<replacement>/)を使用して、セミコロンのインスタンスとそれに続くすべての行を空の文字列に置き換えます。
  • print if /\S/正規表現に一致する行を出力します\S。これは、すべての非空白文字に一致する文字クラスです。

1

ここに私が使用するものがあります、ただ ';'に置き換えてください コメント文字(たとえば、多くのUNIXサービス構成ファイルの場合は「#」):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

すべての行コメント(先頭に空白があっても)、およびコメント行以外の行を終了するコメントはすべて削除され、出力から空白行も簡単に削除されます。これはパイプラインなしでも可能かもしれません(私のsed-fuやawk-fuは確かに素晴らしいものではありません)が、理解するのはとても簡単です(覚えている)、私はここに投稿すると思いました。


1

例は、行のみを表示し、新しい行または空の行を表示しません。

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

または

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server

2
の使用egrepは長く非推奨です。grep -Eここで探しているコマンドです。
mikeserv 14年

0
egrep -v ^'(#|$)' file.txt

file.txtからすべてのコメントと空行を削除します


2
初心者向けのもう少しの情報(たとえば、使用している正規表現が正確に何をするか)で答えを拡大することを検討する必要があります。
HalosGhost 14

egrep減価償却されます。grep -Ev代わりに使用してください。
妖怪


0

次のコマンドを使用して、空の行と新しいファイルの#で始まる行を除外して、行を保存できます。

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>


役に立たないcatパイプとegrepは減価償却されておりgrep -E、拡張式または単にに置き換えられgrep -vます。
妖怪
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.