免费注册 查看新帖 |

Chinaunix

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

请教一个文本处理问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-29 15:46 |只看该作者 |倒序浏览
源文件txt内容如下:
root@mango:~/scripts# cat txt
中国  (中国)
世界
美国
(美国)
加拿大
英国
俄罗斯
(俄罗斯)
阿富汗

希望处理后的结果为:(即将带括号的行和上一行合并)
root@mango:~/scripts# cat txt
中国  (中国)
世界
美国(美国)
加拿大
英国
俄罗斯(俄罗斯)
阿富汗

问: 如何用简单的命令实现,为什么 sed 's/$^(/(/g'  不能达到目的呢

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2012-03-29 16:55 |只看该作者
回复 1# serapy

  1. $ cat /tmp/t
  2. 中国  (中国)
  3. 世界
  4. 美国
  5. (美国)
  6. 加拿大
  7. 英国
  8. 俄罗斯
  9. (俄罗斯)
  10. 阿富汗

  11. $ perl -e 'local $/; $f=<>; $f =~ s/.\(/\(/sg; print $f' /tmp/t
  12. 中国 (中国)
  13. 世界
  14. 美国(美国)
  15. 加拿大
  16. 英国
  17. 俄罗斯(俄罗斯)
  18. 阿富汗
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2012-03-29 16:57 |只看该作者
serapy 发表于 2012-03-29 15:46
为什么 sed 's/$^(/(/g'  不能达到目的呢


因为默认情况下 sed 是逐行处理你的文件的。

论坛徽章:
0
4 [报告]
发表于 2012-03-29 17:03 |只看该作者
回复 3# MMMIX


    十分感谢!

论坛徽章:
0
5 [报告]
发表于 2012-03-29 17:19 |只看该作者
本帖最后由 hbmhalley 于 2012-03-29 17:21 编辑
  1. sed 'N;s/\n(/ (/;t;P;D'
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-03-29 17:48 |只看该作者
回复 2# MMMIX


    用awk实现了:
   cat txt|awk 'BEGIN{
      newline="";
      flag="";
              };
   {  newline=$0;
      flag=substr(newline,1,1);
      if(flag=="("){
         oldline=oldline newline;
       }else{
         printf("%s\n",oldline);
         oldline=newline;
       }
   }
   END{
      printf("%s\n",oldline);
  }'

论坛徽章:
0
7 [报告]
发表于 2012-03-29 18:02 |只看该作者
回复 5# hbmhalley


    谢谢,佩服~~

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
8 [报告]
发表于 2012-03-30 08:22 |只看该作者
vi也可以

  1. vim -e -s txt < proc.vim
复制代码
proc.vim内容为

  1. %s/\n\((\)\@=
  2. wq
复制代码

论坛徽章:
0
9 [报告]
发表于 2012-03-30 09:06 |只看该作者
回复 8# timespace


    连vi都可以,佩服,谢谢~

论坛徽章:
0
10 [报告]
发表于 2012-03-30 09:08 |只看该作者
hbmhalley 发表于 2012-03-29 17:19


  你这能实现???  我试了下 实现不了啊... 说"有多余字符"  :wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP