中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-12 04:40
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决]如何用sed实现这样的排版(把一行分成多行)? 查看 1,348 回复 8
楼 主 [已解决]如何用sed实现这样的排版(把一行分成多行)? 发表于 2010-12-01 15:07 ·  中国 河南 新乡 联通
初级用户
★★
积分 96
发帖 83
注册 2009-06-04 00:54
17年会员
UID 146648
性别 男
来自 信阳
状态 离线
想用sed实现把一个很长的行换成多个这样的行:每行都是9个汉字(最后一行可不是9个汉字)就是说,每段中每9个汉字换行一次.
例如:
输入:

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

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

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

[ Last edited by 740011611 on 2010-12-5 at 18:23 ]
2 发表于 2010-12-01 17:46 ·  中国 湖北 黄石 电信
中级用户
★★
积分 330
发帖 244
注册 2006-04-14 14:07
20年会员
UID 53823
性别 男
来自 湖北
状态 离线
sed "s/\(*.\)\{9\}/\0\r\n/g" srcfile.txt

处理结果如下:

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


每行9个中文字符,包括中文标点。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
740011611 +1 2010-12-01 17:54
3 发表于 2010-12-01 17:50 ·  中国 湖北 黄石 电信
中级用户
★★
积分 330
发帖 244
注册 2006-04-14 14:07
20年会员
UID 53823
性别 男
来自 湖北
状态 离线
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(/((?:*){9})/gm, "$1\r\n"))


处理结果:

不坚持,痛苦会一直留
下来;坚持下去,过程可
能会辛苦一点。
4 发表于 2010-12-01 17:52 ·  中国 河南 新乡 联通
初级用户
★★
积分 96
发帖 83
注册 2009-06-04 00:54
17年会员
UID 146648
性别 男
来自 信阳
状态 离线
多谢楼上的代码。能稍微解释一下这段代码吗?刚学sed,很多还看不懂。
上网查了\x7F-\xFF代表汉字,但是后面的/\0\r\n/是什么意思呢?难道是换行了?

[ Last edited by 740011611 on 2010-12-1 at 18:21 ]
5 发表于 2010-12-01 18:28 ·  中国 湖北 黄石 电信
中级用户
★★
积分 330
发帖 244
注册 2006-04-14 14:07
20年会员
UID 53823
性别 男
来自 湖北
状态 离线
sed "s/\(*.\)\{9\}/\0\r\n/g" srcfile.txt


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

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

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

4、sed从左到右依次处理,就得到最后的结果
6 发表于 2010-12-01 19:33 ·  中国 河南 新乡 联通
初级用户
★★
积分 96
发帖 83
注册 2009-06-04 00:54
17年会员
UID 146648
性别 男
来自 信阳
状态 离线
谢谢。那么\0是什么意思啊?
还有就是把题目换成每九个字符(包括英文和数字)换行而不一定是每9个汉字换一次行?
7 发表于 2010-12-01 21:29 ·  中国 广东 佛山 顺德区 电信
初级用户
★★
积分 151
发帖 106
注册 2009-10-09 21:24
16年会员
UID 152856
性别 男
来自 河南省
状态 离线
sed 是一个命令还是脚本
8 发表于 2010-12-01 21:49 ·  中国 吉林 延边朝鲜族自治州 电信
银牌会员
★★★
正在学习中的菜鸟...
积分 1,039
发帖 897
注册 2009-03-01 15:34
17年会员
UID 140302
性别 男
来自 在地狱中仰望天堂
状态 离线
Originally posted by zaixinxiangnian at 2010-12-1 21:29:
sed 是一个命令还是脚本
第三方扩展命令
9 发表于 2010-12-05 18:26 ·  中国 河南 新乡 联通
初级用户
★★
积分 96
发帖 83
注册 2009-06-04 00:54
17年会员
UID 146648
性别 男
来自 信阳
状态 离线
{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 ]
论坛跳转: