免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234567
最近访问板块 发新帖
楼主: stephen412
打印 上一主题 下一主题

发道题目,大家共勉一下! [复制链接]

论坛徽章:
0
61 [报告]
发表于 2006-08-27 12:51 |只看该作者
原帖由 r2007 于 2006-8-25 18:29 发表
13, 22, 25楼应该都可以的
25楼的我试了一下,结果如下:

I am a student , I like UNIX , I aways read the ^_^ , I know it is very important for me .
But , User and I do not like the ^_^ . Since it ...


r2007,你好!
看了你前面的帖子,有两点疑问:

1. 看了22楼的方法,如下(sedtest3是我自己命名的原始文件):

  1. sed  ':a;N;$s/User[ \n]and[ \n]Operation[ \n]Documents/^_^/g;ba' sedtest3
复制代码

运行结果OK。
弱问一下,替换(s)前面那个$是什么意思?表示文件结束吗的地址?


2. 对于25楼的解法,如下:

  1. s="User and Operation Documents"
  2. r="^_^"
  3. sed ':r;h;s/\n/ /g;s/'"$s"'/'"$r"'/g;Tj;h;:j;s/$/\n'"$s"'/;T;s/.*\(.*.\)\n\1/&/;g;T;N;br'  sedtest3
复制代码

为什么在我执行脚本的时候会出现以下错误提示?
sed: -e expression #1, char 52: Unknown command: ``T''


我很少见到象T、j之类的指令,能解释解释吗?

[ 本帖最后由 Suchangyu 于 2006-8-27 21:56 编辑 ]

论坛徽章:
0
62 [报告]
发表于 2006-08-27 15:09 |只看该作者
t 好像是  test
用来sed的控制流程。
T j 是什么呢?

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
63 [报告]
发表于 2006-08-27 17:08 |只看该作者
man sed
       T label
              If  no  s///  has  done a successful substitution since the last
              input line was read and since the last  t  or  T  command,  then
              branch to label; if label is omitted, branch to end of script.

如果版本不支持,可以这样
  1. :r
  2. h
  3. s/\n/ /g
  4. /User and Operation Documents/ {
  5.     s//^_^/g
  6.     h
  7. }
  8. s/$/\nUser and Operation Documents/
  9. /\(.*.\)\n\1/ {
  10.     g
  11.     N
  12.     b r
  13. }
  14. g
复制代码

写成多行便于阅读,愿意合成一行也没问题。

论坛徽章:
0
64 [报告]
发表于 2006-08-27 22:40 |只看该作者
to r2007:
你在上楼发布的脚本测试过吗?
在我这里没有成功,我猜想是你在替换部分用\n表示换行符的原因,把脚本做如下修改:

  1. :r
  2. h
  3. s/\n/ /g
  4. /User and Operation Documents/ {
  5.     s//^_^/g
  6.     h
  7. }
  8. s/$/\
  9. User and Operation Documents/

  10. /\(.*.\)\n\1/ {
  11.     g
  12.     N
  13.     b r
  14. }
  15. g
复制代码

结果就OK了。

这是否是sed版本的问题?
以下是我的sed版本:

  1. GNU sed version 3.02
复制代码


PS: 你给的脚本还没读懂,正在努力中。

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
65 [报告]
发表于 2006-08-27 22:46 |只看该作者
说实话,不积跬步无以至千里。都是一步一步走过来的,现在还在走。祝楼上日日有收获。
欢迎探讨

BTW:  我的脚本试过了,gnu sed 4.09没问题.

[ 本帖最后由 r2007 于 2006-8-27 22:48 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
66 [报告]
发表于 2006-08-28 10:55 |只看该作者
原帖由 stephen412 于 2006-8-26 11:47 发表



同意啊 !r2007 确实很强,但是我的帖子就是一个共勉的帖子啊 !

PS:又在争谁的贡献这个问题!我们国人的一个很大的....

桃李不言,下自成蹊。不知道是谁在争所谓的“贡献”。我以为,以r2007的功力,说他“争贡献”简直是种侮辱。^_^
多行的问题,perl甚至awk都是更好的选择,用sed来做本来就有点笨拙;而楼主的代码与他的“自信”更是难以匹配。罢了,不说了!^_^

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
67 [报告]
发表于 2006-08-28 11:40 |只看该作者
原帖由 Suchangyu 于 2006-8-27 22:40 发表
to r2007:
你在上楼发布的脚本测试过吗?
在我这里没有成功,我猜想是你在替换部分用\n表示换行符的原因,把脚本做如下修改:
[code]
:r
h
s/\n/ /g
/User and Operation Documents/ {
    s//^_^/g
   ...

你说对了,3.x版本的GNU sed是有这个问题,4.x中解决了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP