免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1122 | 回复: 0
打印 上一主题 下一主题

把多行文本连接到一行的办法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-24 01:12 |只看该作者 |倒序浏览

                                                1. 虽然直观的办法是通过替换, 但最佳的工具应是tr
echo $'1\n2\n3\n4\n5' | tr -d $'\r\n'
如果输入源是文件, 注意不能把文件名摆在tr的最后, 要用
tr -d $'\r\n'

上面特意安插了额外p命令之后, 可以兀显整个处理过程:
第1步: $!N, 在读取第1行之后, 因为不是最后一行, 所以读取下一行内容, 此时pattern中内容有2行
第2步: p1 执行, 显示了pattern空间中A, B两行的内容, 被显示的内容是有\n的.
第3步: s命令把"1\n2\n" 的内容替换为"12\n"
第4步: p2 执行, 显示s处理之后的pattern 空间中的新内容: "12\n"(C行) 这是C行的内容
第5步: 因为第3步中s命令成功执行, tb命令把处理流程转到标号b处.
下一个循环中,
第1步: $!N, 读取第3行, pattern中内容为"12\n3\n"
第2步: p1执行, 显示内容为"12\n3\n"(D, E行)
第3步: s命令成功执行, 把pattern空间中的内容替换为"123\n"
第4步: p2执行, 显示"123\n"(F行)
第5步: 因为前面第3步s替换成功, 所以转到标号b处.
再一个循环中:
第1步: $!N, 因为已经处于最后一行, 所以读取不到额外内容了, pattern空间中内容保持不变, 为"123\n"
第2步: p1执行, 显示"123\n"(G行)
第3步: s命令把"123\n" 替换后, 内容不变, 仍为"123\n", 视为替换不成功
第4步: p2执行, 显示"123\n"(H行)
第5步: 由于第3步s命令失败, 不执行tn跳转, 进行下一个命令:
第6步: p, 显示整个pattern中的内容为"123\n"(I行), 注意最后那个\n挥之不去.
优点: 无论如何还算可行
缺点: 写法复杂, 需要多次try/error, 对大文件不友好, 整个文件内容全部放入缓冲区.
最后, 一个可能的变体:
echo $'1\n\r2\n3\n4\n5' |sed -n $':n $!{N;bn;};s/\\\n\|\\r//gp'
在执行时会比前者快, 因为执行s替换命令只有一次. 而且上述命令也支持DOS/MAC格式的文件.
3. paste
paste -d "" -s readme.txt
优点: 简单
缺点: 不容易想到, 只适用unix格式的文本文件, 对\r\n, 或\n\r(MAC)不行
4. od -t x1 readme.txt | sed 's/^[0-9]*\b//;s/\b0a\b//g;s/ //g'  | xxd -r -ps
od -t x1 的输出中, 最开头是7个数字的地址, 第一个s/^[0-9]*\b// 把地址部分去掉, 第二个s/\b0a\b//g 把换行符去掉. 第三个s/ //g 是把所有空格去掉. 最后用xxd -r -ps把hex string转回来显示.
优点: 容易扩展为处理DOS/MAC格式的文件. 步骤分明, 容易理解.
缺点: 不容易想到.
               
               
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8681/showart_2129293.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP