中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决]如何用sed实现这样的排版(把一行分成多行)?
作者:
标题: [已解决]如何用sed实现这样的排版(把一行分成多行)? 上一主题 | 下一主题
740011611
初级用户





积分 96
发帖 83
注册 2009-6-4
来自 信阳
状态 离线
『楼 主』:  [已解决]如何用sed实现这样的排版(把一行分成多行)?

想用sed实现把一个很长的行换成多个这样的行:每行都是9个汉字(最后一行可不是9个汉字)就是说,每段中每9个汉字换行一次.
例如:
输入:

不坚持,痛苦会一直留下来;坚持下去,过程可能会辛苦一点。

把上面一行文字分割成如下3小行,不知sed能否实现?
输出:

不坚持,痛苦会一直    ----->9个字符
留下来;坚持下去,    ------>9个字符
过程可能会辛苦一点。  ------->10个字符

[ Last edited by 740011611 on 2010-12-5 at 18:23 ]

2010-12-1 15:07
查看资料  发送邮件  发短消息 网志  OICQ (740011611)  编辑帖子  回复  引用回复
freeants001
中级用户




积分 330
发帖 244
注册 2006-4-14
来自 湖北
状态 离线
『第 2 楼』:  

sed "s/\([^\x7F-\xFF]*[\x7F-\xFF].\)\{9\}/\0\r\n/g" srcfile.txt

处理结果如下:

不坚持,痛苦会一直
留下来;坚持下去,
过程可能会辛苦一点


每行9个中文字符,包括中文标点。

   此帖被 +1 点积分    点击查看详情   
评分人:【 740011611 分数: +1  时间:2010-12-1 17:54


2010-12-1 17:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
freeants001
中级用户




积分 330
发帖 244
注册 2006-4-14
来自 湖北
状态 离线
『第 3 楼』:  

JS脚本,每行九个汉字,不含中文标点。
var INPUT_FILE = 'dstFile.txt';
var OUTPUT_FILE = 'srcFile.txt';
var fso=WScript.CreateObject('scripting.filesystemobject')
fso.CreateTextFile(INPUT_FILE,2).write(fso.openTextfile(OUTPUT_FILE,1).readall().replace(/((?:[^\u4E00-\u9FCF]*[\u4E00-\u9FCF]){9})/gm, "$1\r\n"))
处理结果:

不坚持,痛苦会一直留
下来;坚持下去,过程可
能会辛苦一点。


2010-12-1 17:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
740011611
初级用户





积分 96
发帖 83
注册 2009-6-4
来自 信阳
状态 离线
『第 4 楼』:  

多谢楼上的代码。能稍微解释一下这段代码吗?刚学sed,很多还看不懂。
上网查了\x7F-\xFF代表汉字,但是后面的/\0\r\n/是什么意思呢?难道是换行了?

[ Last edited by 740011611 on 2010-12-1 at 18:21 ]

2010-12-1 17:52
查看资料  发送邮件  发短消息 网志  OICQ (740011611)  编辑帖子  回复  引用回复
freeants001
中级用户




积分 330
发帖 244
注册 2006-4-14
来自 湖北
状态 离线
『第 5 楼』:  

sed "s/\([^\x7F-\xFF]*[\x7F-\xFF].\)\{9\}/\0\r\n/g" srcfile.txt


1、蓝色部分匹配中文字符第一字节,由于一个中文字符占2字节,所以后面补一个.。[\x7F-\xFF].

2、红色部分匹配非中文字符,后面的*表次这个字符可以出现任意多次。[^\x7F-\xFF]

3、1,2组合就形成一个结构,这个结构出现9次就在后面加换行符。\([^\x7F-\xFF]*[\x7F-\xFF].\)\{9\}

4、sed从左到右依次处理,就得到最后的结果

2010-12-1 18:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
740011611
初级用户





积分 96
发帖 83
注册 2009-6-4
来自 信阳
状态 离线
『第 6 楼』:  

谢谢。那么\0是什么意思啊?
还有就是把题目换成每九个字符(包括英文和数字)换行而不一定是每9个汉字换一次行?

2010-12-1 19:33
查看资料  发送邮件  发短消息 网志  OICQ (740011611)  编辑帖子  回复  引用回复
zaixinxiangnian
初级用户





积分 151
发帖 106
注册 2009-10-9
来自 河南省
状态 离线
『第 7 楼』:  

sed 是一个命令还是脚本

2010-12-1 21:29
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (657614933)  编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by zaixinxiangnian at 2010-12-1 21:29:
sed 是一个命令还是脚本

第三方扩展命令



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-12-1 21:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
740011611
初级用户





积分 96
发帖 83
注册 2009-6-4
来自 信阳
状态 离线
『第 9 楼』:  

{len=length($0)
if(len<=9)
print $0
else
{for(i=1;len>9;i+=9)
{print substr($0,i,9)
len-=9
}
print substr($0,i)
}
}
#split the long line
以上保存为splitlongline.awk
gawk -f splitlongline.awk  srcfile.txt

//如果含有英文单词,可能会被截断。
以上想法只是想对文字进行重新排版,然后用sed -i "a\---------" *.txt
给文字加上分割线,放在手机上方便阅读(因为我的手机每行最大容纳9个汉字)

[ Last edited by 740011611 on 2010-12-5 at 18:29 ]

2010-12-5 18:26
查看资料  发送邮件  发短消息 网志  OICQ (740011611)  编辑帖子  回复  引用回复

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


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



论坛跳转: