如何使用sed查找以AAA开头但不以BBB结尾的行

时间:2015-12-19 22:08:32

标签: regex bash sed

我尝试创建一个脚本,将 oracleserver 附加到 / etc / hosts 作为 localhost 的别名。这意味着我需要:

  1. 找到^127.0.0.1 oracleserver$
  2. 的行
  3. 然后,将oracleserver追加到此行
  4. 我知道最佳做法可能是使用负向前看。但是, sed 没有环顾四周的功能:What's wrong with my lookahead regex in GNU sed?。任何人都可以为我提供一些可能的解决方案吗?

2 个答案:

答案 0 :(得分:2)

只需将awk与&&结合使用即可合并两个条件:

awk '/^127\.0\.0\.1/ && !/oracleserver$/ { $0 = $0 "oracleserver" } 1' file

当第一个模式匹配但第二个模式不匹配时,会附加字符串。最后的1始终为 true ,因此awk会打印每一行(默认操作为{ print })。

答案 1 :(得分:0)

我不会使用sed而是使用perl

找到^ 127.0.0.1和NOT oracleserver $

的行
perl -pe 'if ( m/^127\.0\.0\.1/ and not m/oracleserver$/ ) { s/$/oracleserver/ }' 

应该做的伎俩。您也可以将-i.bak添加到就地编辑中。