web-dev-qa-db-ja.com

sedまたはgrepを使用して、正規表現パターンの一致を1行でカウントしますか?

1つの行(または常に1行しかないため、すべての行)にある一致の数を数えます。

のように1行ごとに1つの一致だけをカウントしたくない

echo "123 123 123" | grep -c -E "123" # Result: 1

より良い例:

echo "1 1 2 2 2 5" | grep -c -E '([^ ])( \1){1}' # Result: 1, expected: 2 or 3
28
Tyilo

grep -o次にwc -l

$ echo "123 123 123" | grep -o 123 | wc -l
3
50
Simon Whitaker

最初にスペースを改行に変換する必要があるかもしれません:

$ echo "1 1 2 2 2 5" | tr ' ' $'\n' | grep -c 2
3
1
glenn jackman

Awkを使用しないのはなぜですか? awk '{print gsub(your_regex,"&")}'を使用して各行の一致数を出力するか、awk '{c+=gsub(your_regex,"&")}END{print c}'を使用して一致の総数を出力できます。相対速度は、使用されるawk実装と指定される入力によって異なる場合があることに注意してください。

0
jarno

これはあなたのために働くかもしれません:

sed -n -e ':a' -e 's/123//p' -e 'ta' file | sed -n '$='

GNU sedは次のように書くことができます:

sed -n ':;s/123//p;t' file | sed -n '$='
0
potong

多分以下:

echo "123 123 123" | sed "s/123 /123\n/g" | wc -l

(おそらく醜いですが、私のbash fuはそれほど素晴らしいものではありません)

0
manojlds