档案test
musically us
challenged a goat that day
spartacus was his name
ba ba ba blacksheep
grep -oic "[\s]*" test
grep -oic "[ ]*" test
grep -oic "[\t]*" test
grep -oic "[\n]*" test
所有给我4,当我期待11
grep --version
- > grep (BSD grep) 2.5.1-FreeBSD
在OSX Sierra 10.12上运行此功能
重复空格不应算作一个空格。
答案 0 :(得分:3)
如果你对这个技巧和替代方案持开放态度,你可能会喜欢这个:
$ awk '{print --NF}' <(tr -d '\n' <file)
11
以上解决方案将计算单词之间的“空白”。因此,'fifteen--> <--spaces'
awk的字符串将测量为1,如grep。
如果您需要计算实际的单个空格,可以使用它:
$ awk -F"[ ]" '{print --NF}' <<<"fifteen--> <--spaces"
15
$ awk -F"[ ]" '{print --NF}' <<<" 2 4 6 8 10"
10
$ awk -F"[ ]" '{print --NF}' <(tr -d '\n' <file)
11
向前迈出一步,计算单个空格和标签:
$ awk -F"[ ]|\t" '{print --NF}' <(echo -e " 2 4 6 8 10\t12 14")
13
答案 1 :(得分:2)
tr
通常更适合这种情况(在大多数情况下):
tr -d -C ' ' <file | wc -c
grep
解决方案依赖于grep -o
的输出是换行符分隔的事实 - 例如在可能存在多个空格的以下类型的情况下,它将失败:
v='fifteen--> <--spaces'
echo "$v" | grep -o -E ' +' | wc -l
echo "$v" | tr -d -C ' ' | wc -c
grep
仅在 15 时返回1。
编辑:如果您想计算多个字符(例如 TAB 和 SPACE ),您可以使用:
tr -dC $'[ \t]' <<< $'one \t' | wc -c
答案 2 :(得分:0)
-c
选项计算匹配的行数,而不是单个匹配。使用grep -o
然后管道到wc -l
,这将计算行数。
grep -o ' ' test | wc -l
答案 3 :(得分:0)
只需使用awk:
$ awk -v RS=' ' 'END{print NR-1}' file
11
或者如果你想优雅地处理空文件:
$ awk -v RS=' ' 'END{print NR - (NR?1:0)}' /dev/null
0