中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-15 14:07
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何按空格切分人名 查看 1,107 回复 10
楼 主 如何按空格切分人名 发表于 2007-06-21 17:53 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
a.txt中的每一行都是人名,
特点是:每个名字都用空格分开的,但是两个字的名字中,有的是名字中含空格,有的没有.
并且每一行的名字的数量也不一定
现在我要将a.txt中的所有人名都写入到b.txt中,并且是一行一个名字.
请问有什么办法吗?

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


[ Last edited by bjsh on 2007-7-31 at 12:44 PM ]
2 发表于 2007-06-21 19:27 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
UID 68504
性别 男
来自 湖南==》广东
状态 离线
把那个 文件发出来才好给意见的,否则都是猜测
3 发表于 2007-06-22 02:10 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
UID 44210
状态 离线
比较麻烦
给个思路:

空格分隔后,判断是否为单个字符,如果是,加上后面一个字符,如果不是,用其本身
4 发表于 2007-06-22 03:42 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
sed "s/..\{1,\}/\n&/g" names.txt|findstr "."|more>newfile.ext

Sed下载 17 楼
http://www.cn-dos.net/forum/viewthread.php?tid=30573
5 发表于 2007-06-22 06:18 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
版主的 sed 确实是方便,能解释一下 它是凭什么来确定人名的吗?
我试过将三个字的名字也用空格分开,它也能辨认.
我怕弄错,谢谢!!!!!!
6 发表于 2007-06-22 07:21 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  除了使用第三方软件,纯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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
stornager +3 2007-06-23 12:43
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
7 发表于 2007-06-22 10:41 ·  中国 浙江 杭州 华数宽带
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
UID 75212
性别 男
状态 离线
if !num! equ 2 (
set /p=%%i<nul&echo.
set num=0
) else set /p=%%i<nul&if !num! equ 0 echo.
8 发表于 2007-06-22 12:54 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
RE 26933062:

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


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

关键的匹配模式是这个“..\{1,\}”。因为一个中文字符在sed里面用两个“.”表示匹配,又因为每个姓名至少是用三个“.”来匹配,所以前面用“..”来匹配一个姓名的开头,然后用“\{1,\}”来匹配至少一个的非空字符,所以匹配到一个姓名的前三个“...”之后,遇到空格就停止匹配,所以类似你上面格式的包含姓名的字符都将被这样来处理,最终达到目的。
9 发表于 2007-06-23 02:12 ·  中国 湖南 娄底 冷水江市 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
谢各位,强!!
学习!!!
10 发表于 2007-06-23 08:48 ·  中国 天津 联通
新手上路
积分 2
发帖 1
注册 2007-06-23 08:22
UID 92121
性别 女
状态 离线
学习了.谢谢
11 发表于 2007-06-23 20:28 ·  中国 辽宁 沈阳 联通
初级用户
积分 34
发帖 17
注册 2007-06-23 10:21
UID 92126
性别 男
状态 离线
好好学习天天向上!
论坛跳转: