コメントを含むファイルがあります。
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
コメントなしでこのファイルを印刷したいです。
foo
bar
stuff
morestuff
evenmorestuff
これは多くのアプリケーションで役に立ちます。良い方法はありませんか?
答え1
すべてのコメントを削除する1つの方法は、grep
with-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