【发布时间】:2012-06-17 14:37:06
【问题描述】:
我想在 unix shell 的文档中计算hard tab characters 的数量。
我该怎么做?
我尝试了类似的东西
grep -c \t foo
但它给出了文件 foo 中 t 的计数。
【问题讨论】:
-
您要计算制表符的数量还是包含制表符的行数?在您给出的示例中,如果
\t有效,您将得到后者(包含制表符的行数)。
我想在 unix shell 的文档中计算hard tab characters 的数量。
我该怎么做?
我尝试了类似的东西
grep -c \t foo
但它给出了文件 foo 中 t 的计数。
【问题讨论】:
\t 有效,您将得到后者(包含制表符的行数)。
使用 perl 正则表达式(-P 选项)来 grep 制表符。
所以,要计算文件中制表符的数量:
grep -o -P '\t' foo | wc -l
【讨论】:
您可以使用 Ctrl+V+TAB 在引号之间插入文字 TAB 字符。
一般情况下,您可以通过在其前面加上 Ctrl+V 来插入任何字符;甚至控制字符,例如 Enter 或 Ctrl+C,否则 shell 会解释这些字符。
【讨论】:
我的第一个想法是使用sed 去除所有非制表符,然后使用wc 计算剩余的字符数。
< foo.txt sed 's/[^\t]//g' | wc -c
但是,这也计算换行符,sed 不会触及,因为它是基于行的。所以,让我们使用tr 将所有换行符转换为空格,所以sed 是一行。
< foo.txt tr '\n' ' ' | sed 's/[^\t]//g' | wc -c
根据您的 shell 和 sed 的实现,您可能必须使用文字选项卡而不是 \t,但是,对于 Bash 和 GNU sed,上述方法有效。
【讨论】:
使用 tr 丢弃除制表符以外的所有内容,然后计数:
< input-file tr -dc \\t | wc -c
【讨论】:
Bash 使用$'...' 表示法来指定特殊字符:
grep -c $'\t' foo
【讨论】:
你可以用一个棘手的方式来使用awk:使用tab作为记录分隔符,那么tab字符的个数就是总记录数减1:
ntabs=$(awk 'BEGIN {RS="\t"} END {print NR-1}' foo)
【讨论】:
awk 'BEGIN{FS="\t"}{print NF-1}' foo(FS 是awk 的字段分隔符)。