2

私が試してみました:

 grep -c "\|" *.* 

しかし、連続するパイプの数が正しくないため、うまくいきませんでした。

どうすればこれを達成できますか?

4

5 に答える 5

10

を使用tr(1)して、すべての非パイプ文字を削除してwc(1)から、合計を取得するために使用できます。

cat *.* | tr -d -c '|' | wc -c
于 2009-03-04T22:18:17.057 に答える
6

直感に反しますが、ほとんどの UNIX 正規表現では、エスケープ|すると or 演算子になります。したがって、あなたの行は実際には「無か無か」に一致します (どちらかの側にいくつかの選択肢を追加することで、これをテストできます)。使うだけ

grep -c "|" *.*

次に、grep は文字の出現ではなく、行をカウントします。別のツールを使用できます。または、grep を使用する場合は、それぞれに「|」を付けることができます。独自のラインで。たとえば、sed の場合:

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

注: sed を使用している場合は、多くのテストを行って、想定どおりに動作することを確認することをお勧めします。私はちょうどその時する必要がありました。

最後に、材料を組み合わせます。

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

残念ながら、おそらく unix を使用していないため、これは機能しない可能性があります ( *.*. しかし、うまくいけば、それが問題を説明してくれることを願っています.

于 2009-03-05T00:24:15.443 に答える
3

Perl を使用する別のオプションは次のとおりです。

perl -e 'while(<>){$c+=tr/|/|/};print "$c\n"' *

ワンライナー形式ではない場合:

while(<>){
    $c += tr/|/|/
}
print "$c\n"

while(<>){行は、コマンドまたは からファイルから行を読み取るための Perl マジックですSTDIN。しばらくすると慣れます。行自体は$_、多くの Perl コマンドのデフォルト パラメータである という変数に入ります。たとえばtr、これは のようtr(1)に動作し、デフォルトでは で動作し$_ます。結果を というグローバル変数に入れています$cmy $c = 0;(完全なプログラムでは、ループの外側で字句変数として宣言するのが最善です。)+=演算子は、trコマンドの結果 (この場合はパイプ文字の数) を の現在の値に追加します$c

使用するだけtr(1)の方が明らかに簡単なオプションです。;-)

Using*.*は、UNIX ライクなプラットフォームではおそらく使いたくない DOSism です。

単一引用符を使用して、シェルがパイプ文字を解釈するのを避けると、読み取りが少し良くなります。たとえば、次の方法で回答をテストしました。

$ echo '||||
|||||' | perl -e 'while(<>){$c+=tr/|/|/};print "$c\n"'
9
于 2009-03-04T22:49:34.453 に答える
0

多数のパイプを見つけたい場合は、

fgrep -o "|" | wc -l

少なくとも 1 つのパイプを含む多数の行を検索する場合は、次のようにします。

fgrep -c "|"
于 2014-05-20T18:35:31.430 に答える
-3

試す

grep -c "\|" *.*

bashに関するいくつかのチュートリアルを読んでください

于 2009-03-04T22:05:16.387 に答える