免费注册 查看新帖 |

Chinaunix

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

ed替换行字串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-25 20:04 |只看该作者 |倒序浏览
请问一下如何替换行中字串,文件如下。

Solaris%pg file
123
23412
abc
24234
abc
234232

想用ed命令替换把第三行的abc替换成def,命令如下。

Solaris%ed file
27
1/abc/s//shell/g
?
q
Solaris%

失败,没有改变,请帮忙。可能有朋友问我用vi就可以了,干嘛这么麻烦。因为我要写一个shell,其中要对文件每行解析,匹配的行以下的三行需要替换。比如文件如下:
...
342
123
Line1
Line2
Line3
abcd
1231
...

匹配123,需要把Line1,Line2,Line3用abc,def,ghi分别替换,所以要一行一行读文件,用一个变量记录行数,匹配123的,用ed命令替换。vi不会,而且屏幕会很乱。不想重写文件,如sed重定向到另外一个文件,想直接改。谢谢您的回复!

论坛徽章:
0
2 [报告]
发表于 2004-03-26 01:25 |只看该作者

ed替换行字串

  1. $cat file
  2. 123
  3. 23412
  4. abc
  5. 234234
  6. abc
  7. 234232
  8. $ed -p: file
  9. 36
  10. :3d  #删除第3行
  11. :2a  #在第2行后插入要替换的字符
  12. def
  13. .    #切换都命令模式
  14. :w   #写盘退出
  15. 36
  16. :q
  17. $cat file
  18. 123
  19. 23412
  20. def
  21. 234234
  22. abc
  23. 234232
复制代码
刚刚看了看ed的简单用法,听有趣的@_@,sorry,只会这些..
ps:AD版主的ed用的特棒 怎么好几天没见他啦

论坛徽章:
0
3 [报告]
发表于 2004-03-26 10:24 |只看该作者

ed替换行字串

十分感谢bjgirl,结果完全正确。另外再请教一下吧,呵呵,由于我要用shell,所以要传行数。


  1. Solaris%pg file
  2. 123
  3. abc
  4. 123

  5. Solaris%pg test.sh
  6. #!/bin/sh

  7. LineNo=0
  8. InsertLine=0
  9. NewStr="test"

  10. exec<file
  11. while read LINE
  12. do
  13.     echo $LINE
  14.     LineNo=`expr $LineNo + 1`
  15.     if [ "$LINE" = "abc" ] ; then
  16.         InsertLine=`expr $LineNo - 1`
  17.          ed -p: file<<!
  18.         “$LineNo”d                                      #删除abc行
  19.         “$InsertLine”a                             #在123后添加新行
  20.         “$NewStr”                        #输入新行
  21.       .
  22.         w
  23.         q
  24.         !
  25.     fi               
  26. done
  27. exec < /dev/tty
复制代码


test.sh运行失败,这里shell中使用ed时如何解读传入的变量呢?再次感谢您的回复。

论坛徽章:
0
4 [报告]
发表于 2004-03-26 11:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2004-03-26 12:03 |只看该作者

ed替换行字串

谢谢nkoldbug,3c表示替换第三行,如果在shell中用变量表示替换行数,如何编码呢?
我尝试过以下几种方法
Line=3
...
`$Line`c
或者
“$Line”c
或者
‘$Line’c
或者
\$Line\c
都失败,能否帮忙,谢谢您的回复。

论坛徽章:
0
6 [报告]
发表于 2004-03-26 13:00 |只看该作者

ed替换行字串

问题解决了,首先感谢bjgirl和nkoldbug的帮助。下面的shell是把指定的字串下面六行替换掉。


  1. Solaris%pg file
  2. 123
  3. <section>
  4. 1 - Line1: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  5. 1 - Line2: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  6. 1 - Line3: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  7. 1 - Line4: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  8. 1 - Line5: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  9. 1 - Line6: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  10. 234
  11. 345
  12. aeerte
  13. <section>
  14. 1 - Line1: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  15. 1 - Line2: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  16. 1 - Line3: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  17. 1 - Line4: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  18. 1 - Line5: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  19. 1 - Line6: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq       
  20. 123
  21. abcd

  22. Solaris%pg res.sh
  23. #!/bin/ksh
  24. # The six rows below fixed string <section> in file will be directly replaced
  25. # by NewStr, so backup original is a recommended choice.

  26. NewStr="test"

  27. replace()
  28. {
  29. str=`echo $str | ed -p: file<<!
  30. $LineNo
  31. c
  32. $NewStr
  33. .
  34. w
  35. q
  36. !`
  37. }

  38. main()
  39. {
  40.         row=0
  41.         flag=0
  42.         LineNo=0
  43.         cp -p file file.bak
  44.         exec<file
  45.         while read LINE
  46.         do
  47.                 #echo $LINE
  48.                 LineNo=`expr $LineNo + 1`
  49.                 if [ "$LINE" = "<section>" ] ; then
  50.                         row=6
  51.                         flag=1
  52.                         continue
  53.                 fi
  54.                
  55.                 if [ $flag -eq 1 ] && [ row -ne 0 ]; then
  56.                         row=`expr $row - 1`
  57.                         replace
  58.                 fi               
  59.         done
  60.         exec < /dev/tty       
  61. }
  62. main

复制代码


再次感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP