Linux:计算文件中的空格和其他字符

Bub*_*off 2 regex linux shell perl text

问题:

我需要匹配邮件机软件程序的确切格式.它期望某种格式.我可以计算新行,回车,标签等的数量.使用像

cat -vte
Run Code Online (Sandbox Code Playgroud)

od -c
Run Code Online (Sandbox Code Playgroud)

wc -l ( or wc -c )
Run Code Online (Sandbox Code Playgroud)

但是,我想知道字符和文本部分之间的前导和尾随空格的确切数量.标签也是如此.

题:

您将如何分析然后使用常见的unix工具+ perl或python完全匹配模板?一线人更喜欢.另外,您对匹配DOS编码文件的建议是什么?你会先把它翻译成NIX,然后按原样分析或离开吗?

UPDATE

使用它来查看单个空格[假设文件中没有'%'字符]:

sed 's/ /%/g' filename.000
Run Code Online (Sandbox Code Playgroud)

计划构建一个分析每一行标签和空间内容的脚本.

使用@ shiplu的解决方案,向抗猫人群致敬:

while read l;do echo $l;echo $((`echo $l |  wc -c` - `echo $l | tr -d ' ' | wc -c`));done<filename.000
Run Code Online (Sandbox Code Playgroud)

仍然需要对Windows进行一些调整,但它的方式很好.

示范文本

阅读的关键:

标有\n的换行符

回车标有\ r \n

标有[:space:]的未知空格/制表符(需要对其进行计数)

\r\n
\n
[:space:]Institution Anon LLC\r\n
[:space:]123 Blankety St\r\n
[:space:]Greater Abyss, AK  99999\r\n
\n
\n
[:space:]                                10/27/2011\r\n
[:space:]Requested materials are available for pickup:\r\n
[:space:]e__\r[:space:]                     D_ \r[:space:]   _O\r\n
[:space:]Bathtime for BonZo[:space:]       45454545454545[:space:]  10/27/2011\r\n
[:space:]Bathtime for BonZo[:space:]       45454545454545[:space:]  10/27/2011\r\n
\n
\n
\n
\n
\n
\n
[:space:]                             Pantz McManliss\r\n
[:space:]                             Gibberish Ave\r\n
[:space:]                             Northern Mirkwood, ME  99999\r\n
( untold variable amounts of \n chars go here )
Run Code Online (Sandbox Code Playgroud)

更新2

将IFS与read一起使用会给下面某人发布的ruby提供类似的结果.

while IFS='' read -r line
 do 
     printf "%s\n" "$line" | sed 's/ /%/g' | grep -o '%' | wc -w
 done < filename.000
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 5

perl -nlE'say 0+( () = /\s/g );'
Run Code Online (Sandbox Code Playgroud)

与当前接受的答案不同,这不会将输入拆分为字段,从而丢弃结果.它也不会不必要地创建一个数组来计算列表中的值的数量.

使用的习语:

  • 0+( ... )强加标量上下文scalar( ... ),但它更清晰,因为它告诉读者一个数字是预期的.
  • 标量上下文中的列表赋值返回其RHS返回的元素数,因此0+( () = /.../g )给出() = /.../g匹配的次数.
  • -l当与之一起使用时-n,将导致输入"扼杀",因此这将从计数中删除换行.

如果您只对空间(U + 0020)和制表符(U + 0009)感兴趣,则以下内容更快更简单:

perl -nE'say tr/ \t//;'
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都可以通过STDIN或通过参数命名的文件传递输入.