问题:
我需要匹配邮件机软件程序的确切格式。它期望某种格式。我可以计算新行,回车,标签等的数量。使用像
这样的工具cat -vte
和
od -c
和
wc -l ( or wc -c )
但是,我想知道字符之间前导和尾随空格的确切数量 和文本部分。标签也是如此。
问题:
您将如何分析然后使用常见的unix完全匹配模板 工具+ perl或python?一线人更喜欢。另外,您对匹配的建议是什么? DOS编码文件?你会先把它翻译成NIX,然后按原样分析或离开吗?
更新
使用它来查看单个空格[假设文件中没有'%'字符]:
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
标有[: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
答案 0 :(得分:5)
perl -nlE'say 0+( () = /\s/g );'
与当前接受的答案不同,这不会将输入拆分为字段,从而丢弃结果。它也不会不必要地创建一个数组来计算列表中的值的数量。
使用的成语:
0+( ... )
强加标量上下文,如scalar( ... )
,但它更清晰,因为它告诉读者一个数字是预期的。0+( () = /.../g )
给出() = /.../g
匹配的次数。-l
与-n
一起使用时,会导致输入被“限制”,因此会从计数中删除换行符。如果您只对空间(U + 0020)和标签(U + 0009)感兴趣,以下内容更快更简单:
perl -nE'say tr/ \t//;'
在这两种情况下,您都可以通过STDIN或通过参数命名的文件传递输入。
答案 1 :(得分:4)
Perl或Python中的正则表达式将是这里的方法。
是的,可能需要花费初始时间来学习“perl,schmerl,zwerl”,但是一旦你获得了像正常表达这样的极其强大的工具的经验,它可以为你节省大量的在路上的时间量。
答案 2 :(得分:2)
计算空白:
sed 's/[^ ]//g' FILE | tr -d "\n" | wc -c
文本之前,之后和之间。您是想在同一个过程中计算换行符,制表符等并将它们相加,还是作为单独的步骤?
答案 3 :(得分:2)
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,}
或您认为合适的最小值。
答案 4 :(得分:1)
如果你想计算space
中pm.txt
的数量,这个命令就可以了,
cat pm.txt | while read l;
do echo $((`echo $l | wc -c` - `echo $l | tr -d ' ' | wc -c`));
done;
如果您想计算space
的数量,\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*
;
答案 5 :(得分:1)
如果Ruby计数(它确实计算:)
ruby -lne 'puts scan(/\s/).size'
现在有些Perl(稍微不那么直观的恕我直言):
perl -lne 'print scalar(@{[/(\s)/g]})'
答案 6 :(得分:0)
如果你问我,我会写一个简单的C程序来一次性完成计数和格式化。但那只是我。当我用perl,schmerl,zwerl完成小提琴放屁时,我已经浪费了半天。