【问题标题】:How to remove the line breaker character '\n' from the result of lookup() module in Ansible?如何从 Ansible 中的 lookup() 模块的结果中删除换行符 '\n'?
【发布时间】:2015-11-08 01:37:15
【问题描述】:

我正在使用 [file lookup] 读取整个文件并将内容存储在变量中。我的剧本是这样的:

  - name: Store foo.xml contents in a variable
    set_fact:
     foo_content: "{{ lookup('file', 'foo.xml' ) | replace('\n', '')}}"

所以上面的代码读取foo.xml文件并存储在变量中,但问题是当foo.xml中有换行符时,它还包括变量中的换行符。

我的foo.xml是这个文件:

<?xml version="1.0" encoding="utf-8"?>
<initialize_param>
    <secrets>
        <my_secret id="99">3VMjII6Hw+pd1zHV5THSI712y421USUS8124487128745812sajfhsakjfasbfvcasvnjasjkvbhasdfasgfsfaj5G8A9+n8CkLxk7Dqu0G8Jclg0eb1A5xeFzR3rrJHrb2GBBa7PJNVx8tFJP3AtF6ek/F/WvlBIs2leX2fq+/bGryKlySuFmbcwBsThmPJC5Z5AwPJgGZx</my_secret>
    </secrets>
</initialize_param>

输出删除换行符 \n 但也包括制表符 \r & \t

我需要摆脱 \n ,也需要摆脱额外的格式(\r & \t),此外,在替换过滤器之后,我在触发数据库更新查询时遇到错误

stderr: /bin/sh: 1: cannot open ?xml: No such file

【问题讨论】:

  • 我的猜测是 \n 只是调试输出的产物,并且在那里得到了正确处理。
  • 不,它实际上将其存储为 \n ,然后当我将变量推送到数据库中时,它会引发错误:
  • 你能澄清一下什么样的错误以及你是如何推送到数据库的吗?
  • stderr: /bin/sh: 2: 语法错误:意外换行
  • 请使用完整信息编辑问题,包括您的脚本、数据库信息等。给定的错误消息没有提供更多信息。

标签: string replace ansible


【解决方案1】:

您可以使用regex_replace 过滤器,因为trim 不会清除问题中提到的其他换行符。

"{{  some_stdout_to_clear | regex_replace('[\\r\\n\\t]+','') }}"

【讨论】:

    【解决方案2】:

    使用 Jinja trim 过滤器:

    "{{ lookup('file', 'foo.xml' ) | trim }}"
    

    【讨论】:

    • 哇,它成功了。我发誓我已经为此工作了好几个小时。我试图使用 uri_module 发布到服务器的 JSON 字符串中有一个尾随 \n。 replace('\n', '') 并没有摆脱它,我想,这到底是什么,我会试试这个,它成功了。啊。我认为这有多个层面的问题,但谢谢您,先生!
    【解决方案3】:

    您可以通过replace filter 做到这一点?

    contents: "{{ lookup('file', '/etc/foo.txt') | replace('\n', '')}}"
    

    【讨论】:

    • 是的,它做到了.. 但是如果 txt 文件被替换为 .xml 怎么办.. 我可能会重新构建我的问题
    • 我们如何在查找中使用多个替换??我正在尝试删除更多像 \r soo 这样的字符,期待这样的内容:“{{lookup('file', '/etc/foo.txt') | replace('\n', '') | replace(' \r', '') }}"
    • 在@andreas-maier 的回答中使用 Jinja 修剪过滤器是更合适和可读的解决方案。
    • @RyanFisher 不,不是。 trim 删除前导和尾随字符,而 op 想要删除所有这些字符,也在中间。另请注意,自发布答案以来,该问题已被大量修改,因此可能没有太大意义。无论如何,感谢您的反对。 :)
    • 在我的情况下 trim 过滤器会起作用(只有一个尾随换行符)。但是,我的变量是 Vault 加密的,并且 trim 没有首先解密。 replace 正确处理它(解密,然后删除换行符)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多