标题: [已解决]如何用sed实现这样的排版(把一行分成多行)?
[打印本页]
作者: 740011611
时间: 2010-12-1 15:07
标题: [已解决]如何用sed实现这样的排版(把一行分成多行)?
想用sed实现把一个很长的行换成多个这样的行:每行都是9个汉字(最后一行可不是9个汉字)就是说,每段中每9个汉字换行一次.
例如:
输入:
不坚持,痛苦会一直留下来;坚持下去,过程可能会辛苦一点。
把上面一行文字分割成如下3小行,不知sed能否实现?
输出:
不坚持,痛苦会一直 ----->9个字符
留下来;坚持下去, ------>9个字符
过程可能会辛苦一点。 ------->10个字符
[
Last edited by 740011611 on 2010-12-5 at 18:23 ]
作者: freeants001
时间: 2010-12-1 17:46
sed "s/\([^\x7F-\xFF]*[\x7F-\xFF].\)\{9\}/\0\r\n/g" srcfile.txt
处理结果如下:
不坚持,痛苦会一直
留下来;坚持下去,
过程可能会辛苦一点
。
每行9个中文字符,包括中文标点。
作者: freeants001
时间: 2010-12-1 17:50
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"))
处理结果:
不坚持,痛苦会一直留
下来;坚持下去,过程可
能会辛苦一点。
作者: 740011611
时间: 2010-12-1 17:52
多谢楼上的代码。能稍微解释一下这段代码吗?刚学sed,很多还看不懂。
上网查了\x7F-\xFF代表汉字,但是后面的/\0\r\n/是什么意思呢?难道是换行了?
[
Last edited by 740011611 on 2010-12-1 at 18:21 ]
作者: freeants001
时间: 2010-12-1 18:28
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从左到右依次处理,就得到最后的结果
作者: 740011611
时间: 2010-12-1 19:33
谢谢。那么\0是什么意思啊?
还有就是把题目换成每九个字符(包括英文和数字)换行而不一定是每9个汉字换一次行?
作者: zaixinxiangnian
时间: 2010-12-1 21:29
sed 是一个命令还是脚本
作者: Hanyeguxing
时间: 2010-12-1 21:49
Quote: |
Originally posted by zaixinxiangnian at 2010-12-1 21:29:
sed 是一个命令还是脚本 |
|
第三方扩展命令
作者: 740011611
时间: 2010-12-5 18:26
{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 ]