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)
perl -nlE'say 0+( () = /\s/g );'
Run Code Online (Sandbox Code Playgroud)
与当前接受的答案不同,这不会将输入拆分为字段,从而丢弃结果.它也不会不必要地创建一个数组来计算列表中的值的数量.
使用的习语:
0+( ... )强加标量上下文scalar( ... ),但它更清晰,因为它告诉读者一个数字是预期的.0+( () = /.../g )给出() = /.../g匹配的次数.-l当与之一起使用时-n,将导致输入"扼杀",因此这将从计数中删除换行.如果您只对空间(U + 0020)和制表符(U + 0009)感兴趣,则以下内容更快更简单:
perl -nE'say tr/ \t//;'
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都可以通过STDIN或通过参数命名的文件传递输入.