【问题标题】:sed with regular expression as a bash variable使用正则表达式作为 bash 变量的 sed
【发布时间】:2021-06-25 08:55:49
【问题描述】:

我们有一个应用程序可以将一些信息保存在加密文件中。要编辑文件,我们必须将文本编辑器名称放在 bash 的环境变量中,例如 EDITOR=vi。然后我们运行应用程序,它会在 vi 中打开解密的文件。我正在尝试提出一个更新加密文件的 bash 脚本。我能想到的唯一解决方案是将 sed 命令而不是 vi 传递给 EDITOR 变量。它非常适合EDITOR='sed -i s#aaaa#bbbb#' 之类的东西。

当我需要空间和正则表达式时,问题就开始了。例如:EDITOR='sed -i -r "s#^(\s*masterkey: )(.*)#\1xxxxx#"' 返回错误。我尝试使用$EDITOR test.txt 在 bash 中运行 EDITOR,我可以看到问题所在。它不喜欢双引号和它们之间的空格,所以我在双引号和 \s 之前添加了一个反斜杠而不是空格。现在它说未终止的地址正则表达式。我用谷歌搜索了几个小时,找不到任何解决方案。我尝试用双引号替换单引号,反之亦然,以及我在互联网上可以找到但没有运气的所有内容。

我该如何转义,我应该在这里转义哪些字符?

更新:
也许如果我解释整个情况,有人可以提出替代解决方案。有一个由 Ruby 编写的应用程序,它位于一个容器内。 Ruby 应用程序有一个用于生产的 secret_key_base,我们应该用EDITOR=vi rails credentials:edit --environment=production 更改密钥。我不知道 Ruby 和 google 没有返回任何用于自动化的 ruby​​ 解决方案,所以我只能考虑向 Ruby 发送 sed 而不是 vi。

【问题讨论】:

  • 你知道vimvim -x 吗? For several hours I googled 那么为什么不直接创建一个可执行文件呢?
  • @KamilCuk,感谢您的评论,但我不想加密或解密文件。这是一个执行大量工作并将其令牌保存在加密文件中的应用程序。我的工作是每月轮换代币。
  • 另外,应用程序位于 docker 容器内,我不允许在那里创建文件。我需要想出一个即时有效的解决方案,并将其放入一个可靠的剧本中。
  • the application is inside a docker container and I am not allowed to create a file there 这很可能是无效的,您当然可以在/tmp 中创建文件。 put that in an ansible playbook 当然 - 去做。请阅读How to Ask,请参阅question checklist。 (不,我不是反对者)
  • @KamilCuk 再次感谢您抽出时间。我知道可以在容器上创建文件。我说我不允许这样做,因为容器正在生产中。

标签: bash sed environment-variables


【解决方案1】:

我该如何转义,我应该在这里转义哪些字符?

这是不可能的。 扩展结果上的分词不能从扩展结果内部转义,它会一直运行。请注意,文件名扩展也会在扩展结果上运行。

使用脚本内容创建一个可执行文件,并将 EDITOR 设置为它。

你可以导出一个 bash shell 函数,在我尝试了一些之后:

myeditor() {
     sed -i -E 's#^(\s*masterkey: )(.*)#\1xxxxx#' "$@"
}
export -f myeditor
EDITOR='bash -c "$@" _ myeditor'

【讨论】:

    猜你喜欢
    • 2019-11-11
    • 2019-08-04
    • 2015-05-17
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多