【问题标题】:How can I use sed to find a line starting with AAA but NOT end with BBB如何使用 sed 查找以 AAA 开头但不以 BBB 结尾的行
【发布时间】:2015-12-19 22:08:32
【问题描述】:

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

  1. 找到^127.0.0.1NOT oracleserver$ 的行
  2. 然后,将oracleserver 附加到这一行

我知道最好的做法可能是使用负面展望。但是,sed 没有环视功能:What's wrong with my lookahead regex in GNU sed?。谁能给我一些可能的解决方案?

【问题讨论】:

    标签: regex bash sed


    【解决方案1】:
    sed -i '/oracleserver$/! s/^127\.0\.0\.1.*$/& oracleserver/' filename
    
    • /oracleserver$/! - 在不以 oracleserver 结尾的行上
    • ^127\.0\.0\.1.*$ - 如果它以 127.0.0.1 开头,则替换整行
    • & oracleserver - 行加上空格分隔符 ' '(必需)和 oracleserver 之后

    【讨论】:

    • 你能解释一下你的解决方案中的点吗?
    • @lifeGoGoGo,查看我的更新。点表示一个字符。
    【解决方案2】:

    只需将 awk 与 && 结合使用即可:

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

    当第一个模式匹配但第二个不匹配时,这会附加字符串。最后的1 总是true,所以awk 打印每一行(默认操作是{ print })。

    【讨论】:

    • 这也有效。但是由于@ndn 给出了 sed 解决方案:)
    【解决方案3】:

    我不会使用sed,而是使用perl

    找到 ^127.0.0.1 而不是 oracleserver$ 的行

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

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

    【讨论】:

    • 如果你要使用perl,为什么不perl -pe -i 's/^(127\.0\.0\.1.*)(?<!oracleserver)$/\1oracleserver/g filename
    • 因为除非必要,否则我不喜欢尝试将所有代码压缩成正则表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多