私が試してみました:
grep -c "\|" *.*
しかし、連続するパイプの数が正しくないため、うまくいきませんでした。
どうすればこれを達成できますか?
を使用tr(1)
して、すべての非パイプ文字を削除してwc(1)
から、合計を取得するために使用できます。
cat *.* | tr -d -c '|' | wc -c
直感に反しますが、ほとんどの UNIX 正規表現では、エスケープ|
すると or 演算子になります。したがって、あなたの行は実際には「無か無か」に一致します (どちらかの側にいくつかの選択肢を追加することで、これをテストできます)。使うだけ
grep -c "|" *.*
次に、grep は文字の出現ではなく、行をカウントします。別のツールを使用できます。または、grep を使用する場合は、それぞれに「|」を付けることができます。独自のラインで。たとえば、sed の場合:
sed 's/|/|\n/g' *.*
注: sed を使用している場合は、多くのテストを行って、想定どおりに動作することを確認することをお勧めします。私はちょうどその時する必要がありました。
最後に、材料を組み合わせます。
cat *.* | sed 's/|/|\n/g' | grep -c "|"
残念ながら、おそらく unix を使用していないため、これは機能しない可能性があります ( *.*
. しかし、うまくいけば、それが問題を説明してくれることを願っています.
Perl を使用する別のオプションは次のとおりです。
perl -e 'while(<>){$c+=tr/|/|/};print "$c\n"' *
ワンライナー形式ではない場合:
while(<>){
$c += tr/|/|/
}
print "$c\n"
while(<>){
行は、コマンドまたは からファイルから行を読み取るための Perl マジックですSTDIN
。しばらくすると慣れます。行自体は$_
、多くの Perl コマンドのデフォルト パラメータである という変数に入ります。たとえばtr
、これは のようtr(1)
に動作し、デフォルトでは で動作し$_
ます。結果を というグローバル変数に入れています$c
。my $c = 0;
(完全なプログラムでは、ループの外側で字句変数として宣言するのが最善です。)+=
演算子は、tr
コマンドの結果 (この場合はパイプ文字の数) を の現在の値に追加します$c
。
使用するだけtr(1)
の方が明らかに簡単なオプションです。;-)
Using*.*
は、UNIX ライクなプラットフォームではおそらく使いたくない DOSism です。
単一引用符を使用して、シェルがパイプ文字を解釈するのを避けると、読み取りが少し良くなります。たとえば、次の方法で回答をテストしました。
$ echo '||||
|||||' | perl -e 'while(<>){$c+=tr/|/|/};print "$c\n"'
9
多数のパイプを見つけたい場合は、
fgrep -o "|" | wc -l
少なくとも 1 つのパイプを含む多数の行を検索する場合は、次のようにします。
fgrep -c "|"
試す
grep -c "\|" *.*
bashに関するいくつかのチュートリアルを読んでください