中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 如何按空格切分人名 上一主题 | 下一主题
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『楼 主』:  如何按空格切分人名

a.txt中的每一行都是人名,
特点是:每个名字都用空格分开的,但是两个字的名字中,有的是名字中含空格,有的没有.
并且每一行的名字的数量也不一定
现在我要将a.txt中的所有人名都写入到b.txt中,并且是一行一个名字.
请问有什么办法吗?


a.txt中的部分内容如下
张 三  李四  王二麻子 周 平 李建国  张文 李 军
周 平  王二麻子 周 平 李建国  张 文 李军  王二麻子 周 平 李建国  
张三  李 四  王二麻子 周平 李建国  张 文 李 军  王二麻子 周 平 李建国
李建国
王二麻子 周 平 李建国
周 平 张 三
王二麻子 周平 李建国


[ Last edited by bjsh on 2007-7-31 at 12:44 PM ]

2007-6-21 17:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 2 楼』:  

把那个 文件发出来才好给意见的,否则都是猜测

2007-6-21 19:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 3 楼』:  

比较麻烦
给个思路:

空格分隔后,判断是否为单个字符,如果是,加上后面一个字符,如果不是,用其本身



2007-6-22 02:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  


sed "s/[^ ]..[^ ]\{1,\}/\n&/g" names.txt|findstr "."|more>newfile.ext
Sed下载 17 楼
http://www.cn-dos.net/forum/viewthread.php?tid=30573

2007-6-22 03:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 5 楼』:  

版主的 sed 确实是方便,能解释一下 它是凭什么来确定人名的吗?
我试过将三个字的名字也用空格分开,它也能辨认.
我怕弄错,谢谢!!!!!!

2007-6-22 06:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 6 楼』:  

  除了使用第三方软件,纯P并非不能胜任:
@echo off
:: 只能处理两个字的名字分开的情形
:: 把每行中同一名字间的空格去掉
setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do call :pickup %%i
pause
exit

:pickup
set num=0
for %%i in (%*) do (
    set str=%%i
    if "!str:~1!"=="" set /a num+=1
    if !num! equ 2 (
        set /p=%%i<nul
        set num=0
    ) else set /p= %%i<nul
)
echo.
goto :eof
  原来还要求一行一个名字啊,那就用下面这个代码吧:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do call :pickup %%i
pause
exit

:pickup
set num=0
for %%i in (%*) do (
    set str=%%i
    if "!str:~1!"=="" (
        set /a num+=1
    ) else echo %%i
    if !num! geq 1 set /p=%%i<nul
    if !num! equ 2 echo.&set num=0
)
goto :eof
[ Last edited by namejm on 2007-6-22 at 11:59 PM ]

   此帖被 +3 点积分       点击查看详情   
评分人:【 stornager 分数: +3  时间:2007-6-23 12:43




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-6-22 07:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 7 楼』:  

if !num! equ 2 (
        set /p=%%i<nul&echo.
        set num=0
    ) else set /p=%%i<nul&if !num! equ 0 echo.

2007-6-22 10:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 8 楼』:  

RE 26933062:

  Quote:
sed "s/[^ ]..[^ ]\{1,\}/\n&/g" names.txt|findstr "."|more>newfile.ext

首先sed会对第一对//里面的正则表达式进行匹配,如果符合这个模式的就换行之后输出,这样就可以一行一个姓名了。

关键的匹配模式是这个“[^ ]..[^ ]\{1,\}”。因为一个中文字符在sed里面用两个“.”表示匹配,又因为每个姓名至少是用三个“.”来匹配,所以前面用“[^ ]..”来匹配一个姓名的开头,然后用“[^ ]\{1,\}”来匹配至少一个的非空字符,所以匹配到一个姓名的前三个“...”之后,遇到空格就停止匹配,所以类似你上面格式的包含姓名的字符都将被这样来处理,最终达到目的。

2007-6-22 12:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 9 楼』:  

谢各位,强!!
学习!!!

2007-6-23 02:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huihuil
新手上路





积分 2
发帖 1
注册 2007-6-23
状态 离线
『第 10 楼』:  

学习了.谢谢

2007-6-23 08:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinthesky
初级用户





积分 34
发帖 17
注册 2007-6-23
状态 离线
『第 11 楼』:  

好好学习天天向上!

2007-6-23 20:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: