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
がこれを行うための最良の方法であると想定しましたが、実際にはawk
、sed
、egrep
など.
以下を使用できます。
sed -e '/^;/d' php.ini
Grepを介してファイルをパイプする必要はありません。grepはファイル名をコマンドライン引数として受け取ります。
grep -v '^#' file1 file2 file3
#文字で始まる行を除くすべての行を出力します。コメント文字を好きなように変更できます。
複数のコメント文字がある場合(行の先頭にあると想定)
egrep -v '^(;|#|//)' filelist
egrep
を使用すると、cat
の使用を節約できます。つまり、作成するプロセスを減らし(egrep
vs cat
+ egrep
)、使用するバッファを減らします(cat
からegrep
へのパイプパイプなし)。
自分でファイルを読み取ることができるコマンドにファイルを渡すだけの場合は、一般にcat
の使用を制限することをお勧めします。
つまり、次のコマンドは、スペースやタブでインデントされていても、コメントを削除します。
egrep -v '^ [[:blank:]] *;' file.ini
egrep -v '^;|^$' $file
';'で始まる行と空行は除外されます。
正規表現では、^
は行の始まりを示し、$
行末なので、^$
は、行頭文字と行末文字がすぐ隣にある行を指定します。
シンプルな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]
ジェイパルと同様に、私はおそらくこれらの目的のためにawk
を使用するでしょう。さらに悪いことに、Perlはそのような目的で非常に便利な場合があります。
cat data.txt | Perl -lne "print unless /^;/"
Perlの正規表現は、awkの正規表現よりも強力であり、必要な場合があります。
@shabuncの回答の詳細。Perlを使用してコメント(インラインコメントを含む)を取り除き、空白以外の行を出力します。
$ Perl -ne 's/;.*//; print if /\S/' data.txt
説明:
s/;.*//
は、置換演算子(s/<regex>/<replacement>/
)を使用して、セミコロンのインスタンスとそれに続くすべての行を空の文字列で置き換えます。print if /\S/
は、正規表現\S
に一致する場合に行を出力します。これは 文字クラス 空白以外のすべての文字に一致します。これは私が使用するもので、「;」に置き換えてください。コメント文字付き(たとえば、多くのUNIXサービス構成ファイルの「#」):
grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'
これにより、行全体のコメント(先頭に空白がある場合でも)とコメント行以外の行を終了するコメントがすべて削除され、空白行も出力から簡単に削除されます。これはパイプラインなしでも可能かもしれませんが(私のsed-またはawk-fuは確かに素晴らしいものではありません)、理解する(そして覚える)のは簡単なので、ここに投稿すると思いました。
例:行のみを表示する+新しい行または空の行を表示しない:
$ 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
次のコマンドを使用して、空の行と#で始まる行を除いた行を新しいファイルに保存できます。
cat <file to be read> | egrep -v '^#|^$' > <file to be written at>
egrep -v ^'(#|$)' file.txt
File.txtからすべてのコメントと空の行を削除します
空の行も削除します
grep -E -v "^\s*($|;)" php.ini