免费注册 查看新帖 |

Chinaunix

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

[文本处理] [Solved]sed 删除匹配的行,同一命令行中添加同样匹配的新行,怪异后果,求释疑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-28 12:17 |只看该作者 |倒序浏览
本帖最后由 tseesing 于 2014-10-28 13:36 编辑

示例是将 /etc/ntp.conf 中非注释的,0或多个空白开头的,后接 server或pool 的行删除,
即是配置文件中 server 或 pool 有效的配置行删除。

然后再加入新的配置 pool newserver  iburst minpoll 2, 问题在于要添加的该行同样匹配
RE:
  1. '/^[[:space:]]*(\<server\>|\<pool\>)/d'
复制代码

  1. 示例带 -i ,请谨慎试用
  2. /bin/sed  -i -r -e '/^[[:space:]]*(\<server\>|\<pool\>)/d'   \
  3.                       -e '/^[^#].*\<newserver\>/d'   \
  4.                       -e '$apool newserver  iburst minpoll 2'  \
  5.            /etc/ntp.conf
复制代码
sed --version
sed (GNU sed) 4.2.2
Fedora 20

结果:
第一次,新行成功追加到最后一行;
第二次,新行未 append 成功,原来已添加的行,也删除了;即最终文件中观察到的是:只见 d 操作,不见 a 操作
后边的测试就在这两次循环了。

试了几次,发现新添加的行出现在文件末行时才这样,如果将第3个表达式的 $ 换成其它非末行的行号,
或是将 a 换成 i, 则能达到期望。
将欲添加的行,尾部加换行符 \n, 如下:
  1. -e '$apool newserver  iburst minpoll 2\n'
复制代码
也达到期望。
平时习惯是一次命令行成功,则写入 shell script,再执行,没问题,就应用了,殊不知第二次执行才有问题。
现在只能将表达式拆开,分2次执行 sed
不过好奇,有问题请教下:
这种末行才有这样问题的,是故意设计的还是所谓的边缘效应?
好像是在问 sed 的执行方式,为什么只有在末行并且处理对象是文件才会交替地出问题?
在标题所说的情形下,按以上的写法,将表达式全部放到一个 sed  中执行的还可取不?是否可以避免问题?
谢谢

--------编辑:
  经2楼指点,测试下,发现上述描述有误导之处,这里纠正下,无论是文本还是文件,末行成功匹配时,才
是不能正常期望结果,如果末行没有匹配,则 a 命令是能执行到的。
请看 2# 答案。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2014-10-28 12:50 |只看该作者
回复 1# tseesing


man sed

       d      Delete pattern space.  Start next cycle.


最后一行执行了 d 命令,当然不会执行后面的 a 命令了。

论坛徽章:
0
3 [报告]
发表于 2014-10-28 13:32 |只看该作者
回复 2# ly5066113


    原来是这样,谢谢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP