ファイルを手動で検索するときにコメントが多すぎて目が点滅し、コメントがない行だけを表示する方法があってほしいと思うことが多いです。
catや他のツールを使ってコメントをスキップする方法はありますか?方法があり、正規表現が含まれていると思います。私は実際に行などを削除せずに表示したいと思います。
コメントは#形式で、xtermとしてzshを使用します。
答え1
まあ、それはあなたの意見が何を意味するかによって異なります。 aなしで行だけがある場合は#
簡単です。
grep -v '#'
十分かもしれません(ただし、このecho '#'
行はコメントのように呼び出されます)。コメント行が行の場合スタート、#
以下が必要な場合があります。
grep -v '^#'
コメント行が#
オプションのスペースの後ろから始まる行である場合は、次のようになります。
grep -v '^ *#'
コメント形式が完全に異なる場合、この回答は役に立ちません。
答え2
grepだけでは進行中の言語を理解していないため、grepだけではすべてのコメント(またはコメントのみ)を削除することはできません。レビューとは何かを理解するには、次の手順を実行する必要があります。語彙アナライザ特定の言語を理解してください。
特定のプログラミング言語のすべてのコメントを削除する方法にはいくつかの答えがあります。ここに2つの例を追加します。
~のため氏これジョシュリーの答え考える:
gcc -fpreprocessed -dD -E test.c
プリプロセッサを実行しますが、マクロは保持します。
~のためPython unutbuの答え(独自の少し変更を加えて)トークン化を使用して小さな語彙アナライザを作成しました。
import tokenize
import io
import sys
def nocomment(s):
result = []
g = tokenize.generate_tokens(io.BytesIO(s).readline)
for toknum, tokval, _, _, _ in g:
# print(toknum,tokval)
if toknum != tokenize.COMMENT:
result.append((toknum, tokval))
return tokenize.untokenize(result)
print(nocomment(sys.stdin.read()))
その後、プログラミング言語とユースケースごとにこれらのいずれかを書くことができます。 Python語彙アナライザが呼び出されたとします。remove-comments.py
#!/bin/sh
case "$1" in
*.py)
remove-comments.py < "$1"
break
;;
*.c|*.C|*.cc)
gcc -fpreprocessed -dD -E "$1"
break
;;
*)
echo I do not know how to remove comments from $1, sorry
break
;;
esac
スクリプトに名前を付けて語彙分析を追加します。必要/使用する言語について。これは、さまざまなファイル形式からコメントを削除するためのやや強力なデザインでなければなりません。 (file
大文字と小文字の代わりにファイル名を使用することもより安定しています)。
答え3
grep -v "^#" your_file | grep -v "^$" | less
「#」で始まる行を削除し、空の行を削除してから、より良い表示のために結果をに送信しますless
。
答え4
上記の説明で述べたように、ユースケースでは「説明」がどのような形式をとるかによって異なります。しかし、場合によっては、スクリプトを書かなくてもこれで十分です。
解決策:
grep
質問を読むと、すでにファイル検索に使用されていることがわかりますgrep
。
grep your_pattern your_file | grep --perl-regexp --invert-match '(?:^;)|(?:^\s*/\*.*\*/)|(?:^\s*#|//|\*)'
閉じ込められていないもの:
これにより、行に「トリガー」文字、行の別の部分、末尾にコメントがある、または複数行のコメントecho "Hello World" # another comment
の一部になる可能性があります(以下の説明に記載されていない限り)。
これをgrepのポストフィルタとして使用する場合、ほとんどの注釈はまだフィルタリングされ、もはや「目が点滅する」ことを心配する必要はないので、これらの制限は無視できます。
説明する:
3つのモードがあり、必要に応じてユースケースに合わせて変更できます。最初は(?:^;)
文字で始まる行をキャプチャします;
。スペースなしで最初の項目でなければなりません。 2 番目は、 、 で始まる行、先行catches lines that begin with the `/* ... */` comment style, with or without leading white space. The third
空白の有無の行をキャプチャします。最後のパターンは、複数行のコメントから行をキャプチャするのに役立ちます。ここで一般的なスタイルは、最初の行と最後の行を一緒に連結する列を実行することです。たとえば、#
//
*
*
/* ... */
*
/************
*
* This is my
* multi-line
* comment.
*
************/
各モードの周りのシンボルは(? ... )
「非キャプチャ」モードを作成し、速度を上げ、リソース消費を減らします。 grepの引数は、非キャプチャグループ化を可能にし、代替演算子が機能することを可能にする-Pv
Perl正規表現ルールを使用するように指示します。どちらもCLI grepでは機能しません。 grep のマニュアルページでは、-P オプションが実験的であることを警告するので、システムでこのオプションを使用する前にテストしてください。一致を逆にして、パターンと一致しない行を返すように指示します。それらを組み合わせて反対方向に短縮することができます。--perl-regexp
|
--invert-match
grep
-vP
これを通常のポストフィルタとして使用する理由は3つありますgrep
。まず、通常のgrepを実行し、出力にコメントが多すぎて問題がある場合にのみ、この機能を使用する追加の操作を追加できます。 (タイピング回数が少なく、リソース使用量も少なくなります。) 第二に、共通パターンとそれに応じた習慣を開発した可能性があります。デバッグモードに必要なものよりも多くのタスクを追加するのは無駄なタスクです。第三に、複数行のコメントはまったくうまく処理できませんが、必要に応じてファイルをgrepした場合、結果からすべてではなくても、ほとんどのコメントが削除され、目的に適合します。