2009-03-04 6 views

答えて

3

別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 
+0

....私はPerlを知りたがっていますか? Pythonは1ライナーをうまくやっていません。 – Luis

-3

grep -c "\|" *.* 

を試してみて、あなたはすべての非パイプ文字を削除してから合計を取得するためにwc(1)を使用するtr(1)を使用することができますbashの

+0

同じ行に複数のパイプがあると、カウントが正しく行われません。 –

+0

はい、これは私の問題です。 – Luis

+0

あなたは後でそれを変更すると私は正しい答えを与えることができません... – siukurnin

10

についてのいくつかのチュートリアルをお読みください。

cat *.* | tr -d -c '|' | wc -c 
+0

古い学校と非常にいいです。 – dmckee

6

それは直感に反するのですが、ほとんどのUNIX正規表現で、|をエスケープすることは、それまたはオペレータます。だからあなたの行は実際には "何もない"とマッチしています(どちらの側にいくつかの選択肢を追加することでこれをテストできます)。ただ使用する

grep -c "|" *.* 

第2に、grepは文字の出現ではなく行をカウントします。あなたは別のツールを使うことができます。あなたがgrepを主張するならば、それぞれの "|"それ自身の行に例えば、sedを持つ:

sed 's/|/|\n/g' *.* 

注:sedを使用している場合、私はそれはあなたがそれがない何を考えないことを確認するためのテストのたくさんをお勧めします。私はちょうどその時必要でした。

最後に、成分を組み合わせ:あなたはおそらく(理由*.*の)UNIXを使用していないよう

cat *.* | sed 's/|/|\n/g' | grep -c "|" 

残念ながら、これは、あなたのために動作しない場合があります。しかし、うまくいけば、私はいつも奇妙な安心感を見つける問題を説明します。

0

あなたがパイプの数を検索したい場合は、

fgrep -o "|" | wc -l 

あなたは少なくとも一つのパイプで行数を検索したい場合は、

fgrep -c "|" 
関連する問題