ファイルからすべてのコメントを削除する方法は?

ファイルからすべてのコメントを削除する方法は?

コメントを含むファイルがあります。

foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this

コメントなしでこのファイルを印刷したいです。

foo
bar
stuff
morestuff
evenmorestuff

これは多くのアプリケーションで役に立ちます。良い方法はありませんか?

答え1

すべてのコメントを削除する1つの方法は、grepwith-oオプションを使用することです。

grep -o '^[^#]*' file

どこ

  • -o:一致するもののみ印刷部分善意
  • 最初^: 行の先頭
  • [^#]*#:0回以上繰り返される文字を除くすべての文字

空白行も削除されますが、空白のみの行は残ります。

答え2

私はsedこれに関してより良いことができると信じていますgrep

sed '/^[[:blank:]]*#/d;s/#.*//' your_file

説明する

  • sedデフォルトでは、ファイルは1行ずつ表示され、各行は引用符内に変換を適用した後に印刷されます。 (sed '' your_fileすべての行を変更せずに印刷します)。
  • sedここでは、各行に実行する2つのコマンドを提供します(セミコロンで区切ります)。
  • 最初のコマンドは次のとおりです/^[[:blank:]]*#/d。英語では、行が最初のハッシュと一致する場合(前にいくつかのスペースがある場合)、その行は削除されます(印刷されません)。
  • 2番目のコマンドは次のとおりですs/#.*//。つまり、英語では、ハッシュマークの後にできるだけ多く(つまり、行の終わりまで)何でも(最後の2つの間にスペースがない//)置き換えます。
  • 要約すると、これはファイル全体を見直し、コメントとしてのみ構成された行を削除し、その後に続く行にはコメントを削除します。

答え3

他の人が指摘したように、sedや他のテキストベースのツールは、スクリプトの一部がコメントのように見えますが、実際にはコメントでない場合は正しく機能しません。たとえば、文字列で#を見つけることも、非常に一般的な$#andを見つけることもできます${#param}

私は次のようなシェルフォーマッタを書いた。移動する、コードを減らす機能があります。これにはコメントの削除などが含まれます。

$ cat foo.sh
echo $# # inline comment
# lone comment
echo '# this is not a comment'
[mvdan@carbon:12] [0] [/home/mvdan]
$ shfmt -mn foo.sh
echo $#
echo '# this is not a comment'

パーサーとプリンタはGoパッケージなので、カスタムソリューションが必要な場合は、目的の方法でコメントを削除する20行のGoプログラムを作成するのがかなり簡単になります。

答え4

sed コマンドを使用すると、目的の出力を取得できます。以下のコマンドが私にとって効果的でした。

sed 's/#.*$//g' FileName

どこ

  • #.*$#- 正規表現は、行の先頭から最後まですべての文字列をフィルタリングします。

ここではこの行を削除する必要があるため、何も変更せずに「交換」部分をスキップします。

  • g- ファイルの終わりに達するまで検索パターンを繰り返すと述べました。

sedの一般的な構文:s/regexp/replacement/flags FileName

関連情報