web-dev-qa-db-ja.com

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

php.iniのようなcatファイルを使用して;で始まるすべての行を削除する方法があるかどうか知りたい

たとえば、ファイルに次のものが含まれているとします。

;   - 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など.

30
cwd

以下を使用できます。

sed -e '/^;/d' php.ini
33
favadi

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

grep -v '^#' file1 file2 file3

#文字で始まる行を除くすべての行を出力します。コメント文字を好きなように変更できます。

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

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

egrepを使用すると、catの使用を節約できます。つまり、作成するプロセスを減らし(egrep vs cat + egrep)、使用するバッファを減らします(catからegrepへのパイプパイプなし)。

自分でファイルを読み取ることができるコマンドにファイルを渡すだけの場合は、一般にcatの使用を制限することをお勧めします。

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

egrep -v '^ [[:blank:]] *;' file.ini
9
nrolans
egrep -v '^;|^$' $file

';'で始まる行と空行は除外されます。

正規表現では、^は行の始まりを示し、$行末なので、^$は、行頭文字と行末文字がすぐ隣にある行を指定します。

7
Tim Kennedy

シンプルな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] 
2
jaypal singh

ジェイパルと同様に、私はおそらくこれらの目的のためにawkを使用するでしょう。さらに悪いことに、Perlはそのような目的で非常に便利な場合があります。

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

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

2
shabunc

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

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

説明:

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

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

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

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

1
Trey Blancher

例:行のみを表示する+新しい行または空の行を表示しない:

$ 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 

OR

$ 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
1
user11085

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

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

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

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

0
Nikola

空の行も削除します

grep -E -v "^\s*($|;)" php.ini
0
Fedir RYKHTIK