免费注册 查看新帖 |

Chinaunix

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

[文本处理] sed改变流的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-28 22:05 |只看该作者 |倒序浏览
昨天在CU上看到一篇帖子   http://bbs.chinaunix.net/thread-4113025-1-1.html

这是CU.txt的内容:
  1. cat CU.txt
  2.   xxxxxxxxxxxxxxx
  3. xxxxxxxxxxxxx
  4. xxx
  5.   xxxxxxxxxxxxxxx
  6. xxxxxxxxxxxxxxxx
  7. xxxxxxxxxxx
  8. xxxxx
  9.   xxxxxxxxxxxxxxx
  10. xxxxxx
  11. xxxxxxxxxx
复制代码
我开始这么写的:
  1. sed '{
  2. :merge
  3. N
  4. s/\n//
  5. /b merge
  6. s/ /\n/g
  7. }' CU.txt
复制代码
我是想先将\n都取消掉,然后再将空格替换为换行。
但是最后将空格替换为换行不执行...(我后来将替换那段换成 10p ,也就是输出第十行,如果sed -n了,一样也不执行...)
谁能帮我解释下么~~~
THX~~

论坛徽章:
0
2 [报告]
发表于 2013-11-28 23:56 |只看该作者
本帖最后由 linux范进 于 2013-11-28 23:59 编辑

你想达到什么效果呢?有点乱。。
首先,在一个sed后面跟着两个处理过程(或者模式),中间加;
这是我的例子:
  1. [root@localhost ~]# cat test5
  2.   nishinum1
  3. aaaaaaaa
  4. bbb
  5.   nishinum2
  6. cccccccc
  7. dddd
  8.   nishinum3
  9. eeeeeee
  10. fffffffff
  11. [root@localhost ~]# sed 'N;N;s/\n//g;s/[[:space:]]/\n/g' test5

  12. nishinum1aaaaaaaabbb

  13. nishinum2ccccccccdddd

  14. nishinum3eeeeeeefffffffff
  15. [root@localhost ~]# sed --version
  16. GNU sed version 4.2.1
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2013-11-29 00:19 |只看该作者
我把你的代码改成了单行脚本:
  1. sed ':1;N;s/\n//;b1;s/ /\n/g'
复制代码
你的疑问是为什么s/ /\n/g没有执行?

根据你的代码,sed每读一行,就会把它的下一行添加到它的下面,然后通过s/\n//合并,不停地循环,当sed读到最后一行时,此时再执行N,由于已经没有内容可再读了,所以sed就直接结束了,这就是为什么s/ /\n/g没有执行的原因。

为了避免上述的情况,可以稍微改变一下b1
  1. sed ':1;N;s/\n//;$!b1;s/ /\n/g'
复制代码
也可以写成这样:
  1. sed ':1;N;$!b1;s/\n//g;s/ /\n/g'
复制代码

论坛徽章:
6
处女座
日期:2014-04-02 16:07:17酉鸡
日期:2014-04-14 10:09:22子鼠
日期:2014-04-17 11:57:30辰龙
日期:2014-09-01 17:14:08戌狗
日期:2014-10-28 12:25:54未羊
日期:2014-11-14 11:31:58
4 [报告]
发表于 2013-11-29 11:15 |只看该作者
[root@localhost sh]# cat pp
  xxxxxxxxxxxxxxx
xxxxxxxxxxxxx
xxx
  xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxx
xxxxx
  xxxxxxxxxxxxxxx
xxxxxx
xxxxxxxxxx
[root@localhost sh]# sed -rn '1{:1;N;$!b1 s/\n//g;s/\s+/\n/g;p}' pp

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

论坛徽章:
0
5 [报告]
发表于 2013-11-29 14:16 |只看该作者
恩,明白你的意思。
但是不一定一行后面接着2行内容的,可能是3行,可能是4行。
THX~~
回复 2# linux范进


   

论坛徽章:
0
6 [报告]
发表于 2013-11-29 14:53 |只看该作者
恩,意思就是由于条件没有跳出循环,导致一直读取到文本流结束了。
但是文本不是应该都在模式空间里面么,最后一行替换不会将模式空间里的替换掉么?

再问个小问题哈~
  1. cat test.txt
  2. aaaa
  3. bbbb
复制代码
原来文本16进制打开是这样的:
  1. od -x test.txt
  2. 6161 6161 620a 6262 0a62
复制代码
  1. sed '{N; s/\n/ /g}' test.txt | od -x
  2. 6161 6161 6220 6262 0a62
复制代码
也就是
aaaa\n
bbbb\n
替换成了
aaaa bbbb\n
我想问,为什么将bbbb\n这行读取进来了,而之替换aaaa后面的\n呢,为什么不连bbbb后面的也替换了呢?
很感谢你的回答~~~
回复 3# yestreenstars


   

论坛徽章:
0
7 [报告]
发表于 2013-11-29 14:54 |只看该作者
恩恩,明白~~~
谢谢~~~回复 4# rulebook


   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
8 [报告]
发表于 2013-11-29 15:02 |只看该作者
回复 6# lili00681
对于这个问题,我只能说,sed是不会对最后一个\n下手的~

   

论坛徽章:
0
9 [报告]
发表于 2013-11-29 15:05 |只看该作者
哦~
那回到开始的问题哈,
为什么通过循环,不应该把文本都添加到模式空间了么,为什么最后那个替换没有把模式空间的都替换呢,而是不执行呢。
刚刚又看到一个问题:
  1. cat biaoqian
  2. AA
  3. BC
  4. AA
  5. CB
  6. CC
  7. AA
复制代码
  1. sed '{/AA/b lable;s/$/ NO/;:lable;s/$/ YES/}' biaoqian
  2. AA YES
  3. BC NO YES
  4. AA YES
  5. CB NO YES
  6. CC NO YES
  7. AA YES
复制代码
为什么其他的后面也会有yes呢...
回复 8# yestreenstars


   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
10 [报告]
发表于 2013-11-29 15:13 |只看该作者
本帖最后由 yestreenstars 于 2013-11-29 15:15 编辑

回复 9# lili00681
看来你还是没看懂我3楼的意思,sed读到末行时再执行N命令,sed的使命就结束了,还管它后面的替换做什么?

另一个问题参考:
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1762006&fromuid=26669282

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP