- 论坛徽章:
- 0
|
本帖最后由 tseesing 于 2014-10-28 13:36 编辑
示例是将 /etc/ntp.conf 中非注释的,0或多个空白开头的,后接 server或pool 的行删除,
即是配置文件中 server 或 pool 有效的配置行删除。
然后再加入新的配置 pool newserver iburst minpoll 2, 问题在于要添加的该行同样匹配
RE:- '/^[[:space:]]*(\<server\>|\<pool\>)/d'
复制代码
- 示例带 -i ,请谨慎试用
- /bin/sed -i -r -e '/^[[:space:]]*(\<server\>|\<pool\>)/d' \
- -e '/^[^#].*\<newserver\>/d' \
- -e '$apool newserver iburst minpoll 2' \
- /etc/ntp.conf
复制代码 sed --version
sed (GNU sed) 4.2.2
Fedora 20
结果:
第一次,新行成功追加到最后一行;
第二次,新行未 append 成功,原来已添加的行,也删除了;即最终文件中观察到的是:只见 d 操作,不见 a 操作
后边的测试就在这两次循环了。
试了几次,发现新添加的行出现在文件末行时才这样,如果将第3个表达式的 $ 换成其它非末行的行号,
或是将 a 换成 i, 则能达到期望。
将欲添加的行,尾部加换行符 \n, 如下:- -e '$apool newserver iburst minpoll 2\n'
复制代码 也达到期望。
平时习惯是一次命令行成功,则写入 shell script,再执行,没问题,就应用了,殊不知第二次执行才有问题。
现在只能将表达式拆开,分2次执行 sed
不过好奇,有问题请教下:
这种末行才有这样问题的,是故意设计的还是所谓的边缘效应?
好像是在问 sed 的执行方式,为什么只有在末行并且处理对象是文件才会交替地出问题?
在标题所说的情形下,按以上的写法,将表达式全部放到一个 sed 中执行的还可取不?是否可以避免问题?
谢谢
--------编辑:
经2楼指点,测试下,发现上述描述有误导之处,这里纠正下,无论是文本还是文件,末行成功匹配时,才
是不能正常期望结果,如果末行没有匹配,则 a 命令是能执行到的。
请看 2# 答案。 |
|