繁体   English   中英

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

[英]Linux: counting spaces and other characters in file

问题:

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

cat -vte

od -c

wc -l ( or wc -c )

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

题:

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

UPDATE

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

sed 's/ /%/g' filename.000

计划构建一个分析每行选项卡和空间内容的脚本。

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

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

仍然需要对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 )

更新2

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

while IFS='' read -r line
 do 
     printf "%s\n" "$line" | sed 's/ /%/g' | grep -o '%' | wc -w
 done < filename.000
perl -nlE'say 0+( () = /\s/g );'

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

使用的习语:

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

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

perl -nE'say tr/ \t//;'

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

Perl或Python中的正则表达式将是这里的方法。

是的,可能需要花费初始时间来学习“perl,schmerl,zwerl”,但是一旦你获得了像Regular Expressions这样非常强大的工具的经验,它可以为你节省大量的时间。

在此输入图像描述

计算空白:

sed 's/[^ ]//g' FILE | tr -d "\n" | wc -c

文本之前,之后和之间。 您是想在同一个计划中计算换行符,制表符等并将它们相加,还是作为单独的步骤?

perl -nwE 'print; for my $s (/([\t ]+)/g) { say "Count: ", length $s }' input.txt

这将计算制表符或空格的各个组,而不是计算整行中的所有空格。 例如:

    foo        bar

会打印

    foo        bar
Count: 4
Count: 8

您可能希望跳过单个空格(单词之间的空格)。 即不要计算Bathtime for BonZo空间。 如果是这样,请将+替换为{2,}或您认为合适的最小值。

如果你想计算pm.txtspace数,这个命令会做,

 cat pm.txt | while read l; 
 do echo $((`echo $l |  wc -c` - `echo $l | tr -d ' ' | wc -c`));
 done;

如果你想计算space数s, \\r\\n\\t使用这个,

cat pm.txt | while read l;
do echo $((`echo $l |  wc -c` - `echo $l | tr -d ' \r\n\t' | wc -c`));
done;

read将删除任何前导字符。 如果你不想要它,那就有一种讨厌的方式。 首先拆分文件,使每个文件只使用1行

`split -l 1 -d pm.txt`. 

之后会有一堆x*文件。 现在循环它。

for x in x*; do echo $((`cat $x |  wc -c` - `cat $x | tr -d ' \r\n\t' | wc -c`)); done;

rm x*删除那些文件;

如果Ruby计数(它确实计数 :)

ruby -lne 'puts scan(/\\s/).size'

现在有些Perl(稍微不那么直观的恕我直言):

perl -lne 'print scalar(@{[/(\\s)/g]})'

如果你问我,我会写一个简单的C程序来一次性完成计数和格式化。 但那只是我。 当我用perl,schmerl,zwerl完成小提琴放屁时,我已经浪费了半天时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM