私は試しました:どのようにパイプの数( '|')をgrepすることができますか?
grep -c "\|" *.*
しかし、それは連続したパイプのカウントが間違っているので動作しませんでした。
どのようにこれを達成できますか?
私は試しました:どのようにパイプの数( '|')をgrepすることができますか?
grep -c "\|" *.*
しかし、それは連続したパイプのカウントが間違っているので動作しませんでした。
どのようにこれを達成できますか?
別Perlを使用するオプションは、次のとおりです。
perl -e 'while(<>){$c+=tr/|/|/};print "$c\n"' *
だ非ワンライナー形式で
:
while(<>){
$c += tr/|/|/
}
print "$c\n"
while(<>){
行は、コマンドまたはSTDIN
からファイルから行を読み込むためのPerlの魔法です。あなたはしばらく後にそれに慣れます。その行自体は$_
という変数に入ります。これは多くのPerlコマンドのデフォルトのパラメータです。たとえば、tr(1)
のようにかなり動作するtr
は、デフォルトで$_
で動作します。私は結果を$c
というグローバル変数に入れています。 (フルプログラムでは、ループの外にmy $c = 0;
という字句変数を宣言することが最善です)+=
演算子は、$c
の現在の値にtr
コマンドの結果(この場合はパイプ文字の数)を加算します。
tr(1)
を使用するだけで、はるかに簡単なオプションです。 ;-)
を使用する*.*
は、UNIX風のプラットフォームでは使用したくないDOSISです。
シェルのパイプ文字の解釈を避けるために一重引用符を使用すると、少し良くなります。例えば、私は私の答えをテストした:
$ echo '||||
|||||' | perl -e 'while(<>){$c+=tr/|/|/};print "$c\n"'
9
....私はPerlを知りたがっていますか? Pythonは1ライナーをうまくやっていません。 – Luis
それは直感に反するのですが、ほとんどのUNIX正規表現で、|
をエスケープすることは、それまたはオペレータます。だからあなたの行は実際には "何もない"とマッチしています(どちらの側にいくつかの選択肢を追加することでこれをテストできます)。ただ使用する
grep -c "|" *.*
第2に、grepは文字の出現ではなく行をカウントします。あなたは別のツールを使うことができます。あなたがgrepを主張するならば、それぞれの "|"それ自身の行に例えば、sedを持つ:
sed 's/|/|\n/g' *.*
注:sedを使用している場合、私はそれはあなたがそれがない何を考えないことを確認するためのテストのたくさんをお勧めします。私はちょうどその時必要でした。
最後に、成分を組み合わせ:あなたはおそらく(理由*.*
の)UNIXを使用していないよう
cat *.* | sed 's/|/|\n/g' | grep -c "|"
残念ながら、これは、あなたのために動作しない場合があります。しかし、うまくいけば、私はいつも奇妙な安心感を見つける問題を説明します。
あなたがパイプの数を検索したい場合は、
fgrep -o "|" | wc -l
あなたは少なくとも一つのパイプで行数を検索したい場合は、
fgrep -c "|"
あなたが本当にしたいです「* 。* "?これは、名前にドットがないファイルを除外します。 –