找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27422|回复: 11

[文本处理] 这样奇葩的文本批处理能搞定吗?

[复制链接]
发表于 2014-9-28 18:09:37 | 显示全部楼层 |阅读模式
假设有一文本存放了一批邮箱与昵称,但因为是多人输入帖子回复里的,所以格式很无语的混乱,能不能把这些信息统一成:邮箱空格昵称 的形式?
下面是一些例子,作为测试数据使用。我们大致统计了下有空格、制表符、逗号、分号、竖线、空格竖线空格、百分号、多个相同符号、以及其他组合。
有的一行中还有其他信息。
有的邮箱前后有尖括号。
有的整行都是其他信息。

123456@qq.com cccccccc
123457@qq.com        cccccccc2
1123456@qq.com,cccggggcc
156723457@qq.com;ccccxcvcccc1
1567xzxvdv@163.com | reydhdfhdh
1567xzfgxvdv@163.com|reydfdhdfhdh
1567xzfgxvdv@163.com        %        reydfdhdfhdh
dfhgdxvdv@163.com%%%%reydfdhdfghfhdh
<dfdhgrg456dxvdv@163.com> reyd785hdh
;<dfdhgrg456dxvdv@163.com> | reyd785hdh
其他信息 | reyd785hdh | dfdhgrg456dxvdv@163.com | 其他信息
发表于 2014-9-28 20:49:23 | 显示全部楼层
或许可以这样:
  1. sed -r "s/[^a-z0-9_@\.\s-]+/ /ig;s/^ | $//g;s/(.+) (.+@.+)/\2 \1/" a.txt>b.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
bl5062 + 1 天神下凡!!

查看全部评分

发表于 2014-9-29 06:16:47 | 显示全部楼层
这格式蛋疼得...都直不起腰了
 楼主| 发表于 2014-9-29 08:42:19 | 显示全部楼层
或许可以这样:
apang 发表于 2014-9-28 20:49



    测试了下不行,说没有sed命令,改为set后又说环境变量 -r "s/[^a-z0-9_@\.\s-]+/ /ig;s/^ | $//g;s/(.+) (.+@.+)/\2 \1/" a.txt 没有定义
 楼主| 发表于 2014-9-29 08:45:58 | 显示全部楼层
回复 2# apang
发表于 2014-9-29 08:47:20 | 显示全部楼层
回复 4# bl5062


    请在论坛里搜索sed ,下一个。
发表于 2014-9-29 08:58:41 | 显示全部楼层
回复 4# bl5062


http://bbs.bathome.net/thread-3981-1-1.html
从这里下载一个sed.exe
放到 C:\Windows\System32 目录下面
发表于 2014-9-29 09:23:54 | 显示全部楼层
回复 4# bl5062


    sed 是第三方工具,,和set是不同的概念,,按照7楼的地址和方法操作一下~~祝你成功~
 楼主| 发表于 2014-9-29 11:44:46 | 显示全部楼层
简直天神下凡,居然一句就搞定,佩服!!!!!!!!!!!
话说这就是传说中的正则表达式?能解释下这句话吗?
发表于 2014-9-29 13:12:01 | 显示全部楼层
回复 9# bl5062


嗯,那就是正则表达式,建议你自己找本书看看,比如《精通正则表达式》
发表于 2014-9-29 15:56:30 | 显示全部楼层
本帖最后由 apang 于 2014-9-29 15:58 编辑

回复 9# bl5062


    我是吃五谷杂粮、食人间烟火的人类,不是神仙哦。大致思路:
1:
s/[^a-z0-9_@\.\s-]+/ /ig
把一个或多个连续的非英文字母、数字、下划线、@、点、减号替换成一个空格
(这里的\s是多余的,请删掉)
比如这样一行:
;<dfdhgrg456dxvdv@163.com> | reyd785hdh
会把“;<”替换成一个空格,把“> | ”替换成一个空格

2:
s/^ | $//g
经过第一步处理后,字串开头和结尾可能会含有一个空格字符
这一步就是删掉开头或结尾的空格

3:
s/(.+) (.+@.+)/\2 \1/
如果昵称在前、邮箱在后,则交换它们的位置

注意:代码并不检测邮箱名是否有效(假设a.txt中录入的都是有效邮箱、昵称)

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 s/[^a-z0-9_@\.\s-]+/ /ig

查看全部评分

发表于 2014-9-30 23:45:47 | 显示全部楼层
这奇葩格式啊。。。怎么这么坑。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 23:06 , Processed in 0.034780 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表