AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 486624
Accepted
Jonik
Jonik
Asked: 2013-03-12 04:05:55 +0800 CST2013-03-12 04:05:55 +0800 CST 2013-03-12 04:05:55 +0800 CST

如何在 Puppet 脚本的 sed 命令中转义“/”?

  • 772

在配置文件中,我试图替换PREFIX=/jenkins为PREFIX=/foobar.

在(bash)命令行上,这工作正常:

sed -i.bak s/PREFIX=\\/jenkins/PREFIX=\\/foobar/g /etc/default/jenkins

但是,在 Puppet 脚本(.pp 文件)中:

exec { 'Change-prefix':
  command => "sed -i.bak s/PREFIX=\\/jenkins/PREFIX=\\/foobar/g /etc/default/jenkins",
  path    => ["/bin"],
}

产生:

err: /Stage[main]//Exec[Change-prefix]/returns: change from notrun to 0 failed:
sed -i.bak s/PREFIX=\/jenkins/PREFIX=\/foobar/g /etc/default/jenkins 
returned 1 instead of one of [0] 

如何正确转义 sed 命令?还是有其他问题?

我也尝试过\\\/,但结果是:warning: Unrecognised escape sequence '\/'

puppet
  • 4 4 个回答
  • 7751 Views

4 个回答

  • Voted
  1. Best Answer
    Kenny Rasschaert
    2013-03-12T04:15:51+08:002013-03-12T04:15:51+08:00

    如果您的 sed 表达式包含“/”,您可能需要考虑使用不同的分隔符。我在这个例子中选择了管道符号。

    sed -i.bak 's|PREFIX=/jenkins|PREFIX=/foobar|g' /etc/default/jenkins

    在我看来,在您的 Puppet 清单中使用此语法会更清晰、更易读。


    从 sed 信息页面:

    \%REGEXP%' (The%' 可以替换为任何其他单个字符。)

     This also matches the regular expression REGEXP, but allows one to
     use a different delimiter than `/'.  This is particularly useful
     if the REGEXP itself contains a lot of slashes, since it avoids
     the tedious escaping of every `/'.  If REGEXP itself includes any
     delimiter characters, each must be escaped by a backslash (`\').
    
    • 4
  2. user9517
    2013-03-12T04:16:50+08:002013-03-12T04:16:50+08:00

    在许多版本的 sed 上,您可以使用不同的字符作为分隔符以避免必须转义/例如,使用 | 很常见。或者 #

    sed -i.bak 's#PREFIX=/jenkins#PREFIX=/foobar#g' /etc/default/jenkins
    
    • 4
  3. robbyt
    2013-03-12T22:38:38+08:002013-03-12T22:38:38+08:00

    哇,哇……等一下!Puppet 清单中的 Sed 有点疯狂。您应该使用 puppetlabs stdlib 中的 file_line 资源。

    (你应该安装整个模块,但这里是自定义资源类型) https://github.com/puppetlabs/puppetlabs-stdlib/blob/master/lib/puppet/type/file_line.rb

    例子:

      file_line { 'sudo_rule':
        path => '/etc/sudoers',
        line => '%sudo ALL=(ALL) ALL',
      }
    
    • 3
  4. Jonik
    2013-03-12T04:08:09+08:002013-03-12T04:08:09+08:00

    结果证明\\\\/有效。

    例如:

    exec { 'Change-prefix':
      command => "sed -i.bak s/PREFIX=\\\\/jenkins/PREFIX=\\\\/foorbar/g /etc/default/jenkins",
      path    => ["/bin"],           
    }
    

    编辑:...但是当然,正如肯尼和伊恩所建议的那样,使用不同的定界符是一种更简洁的解决方案!

    • 1

相关问题

  • 如何修复 Puppet 完全限定的参数路径错误?

  • puppet:修改配置文件后强制重启服务

  • 木偶模块资源

  • 傀儡主机名问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve