如何计算文本中的空格?

如何计算文本中的空格?

在下面的示例中,inet 前面有 4 个空格。

wolf@linux:~$ ip address show eth0 | grep 'inet '
    inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0
wolf@linux:~$ 

像这个例子一样,我如何计算空格的数量。

该示例很简单,因为它只有 4 个空格。

如果它有更多怎么办?数百、数千?

是否有捷径可寻?

答案1

您可以使用tr删除所有不是您感兴趣的字符的内容,然后wc计算剩余的字符:

ip address show eth0 | grep 'inet ' | tr -d -c ' ' | wc -m

这可以很好地扩展到大量文本,tr非常高效。

但请注意,对于tr包含 GNU的某些实现tr,仅适用于单字节字符(例如空格字符)。

如果您只想计算前导空格,则需要比以下功能更强大的东西tr

ip address show eth0 | grep 'inet ' | sed 's/[^ ].*$//' | tr -d '\n' | wc -m

这将删除每行中不包含前导空格的所有部分,然后删除换行符和计数。

如何统计每一行中特定字符的个数?如果您对每行的计数感兴趣。

答案2

要计算每行开头的空格字符数,您可以执行以下操作:

awk -F '[^ ].*' '{print length($1)}'

它打印第一个字段的长度(以字符数为单位),其中字段由以非空格开头的任何字符序列分隔。

要报告在输入的任何行开头找到的最大空白量(最大缩进),使用 GNU wc

sed 's/[^[:blank:]].*//' | wc -L

报告的空白量为显示宽度在制表位为 8 列的显示设备上:

$ printf '\tfoo\n' | sed 's/[^[:blank:]].*//' | wc -L
8
$ printf '\u3000foo\n' | sed 's/[^[:blank:]].*//' | wc -L
2

U+3000 字符(表意空格字符,在我的语言环境中被分类为空白)是采用 UTF-8 编码为 3 个字节的双角字符。

如果您希望以字符数来报告最大长度:

sed 's/[^[:blank:]].*//;s/./x/g' | wc -L

s/./x/g将每行上的每个字符转换为x我们知道显示宽度为 1 的字符)。

或者按字节数计算:

sed 's/[^[:blank:]].*//' |
  LC_ALL=C tr -c '\n' '[x*]' | # convert each byte other than newline to x
  wc -L

答案3

  • 打印前导空格数:

    awk '{print match($0,/[^ ]|$/)-1}' file
    

    match($0,/[^ ]|$/)匹配第一个非空格 ( [^ ]) 或行尾 ( $) 并返回其位置。

  • 打印空格数:

    awk -F '[ ]' '{print (NF?NF-1:0)}' file
    

    -F '[ ]'将字段分隔符设置为空格。NF是字段的数量。三元表达式的意思是:“如果 NF 不为 0,则打印 NF-1,否则打印 0”。这是因为如果该行为空,则 NF 为 0。

答案4

我举了下面的例子

`echo "      praveen"| grep -o "^ *"| awk '{print length($0)}'`6

output

6

Python

>>> a="      praveen"
>>> import re
>>> k=re.compile(r'^ *')
>>> m=re.search(k,a)
>>> print len(m.group())
6
>>> 

相关内容