如何从 Ansible 中的 lookup() 模块的结果中删除换行符 '\n'?
Posted
技术标签:
【中文标题】如何从 Ansible 中的 lookup() 模块的结果中删除换行符 \'\\n\'?【英文标题】:How to remove the line breaker character '\n' from the result of lookup() module in Ansible?如何从 Ansible 中的 lookup() 模块的结果中删除换行符 '\n'? 【发布时间】:2022-01-23 13:31:14 【问题描述】:我正在使用 [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: 语法错误:意外换行 请使用完整信息编辑问题,包括您的脚本、数据库信息等。给定的错误消息没有提供更多信息。 【参考方案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
正确处理它(解密,然后删除换行符)。谢谢!以上是关于如何从 Ansible 中的 lookup() 模块的结果中删除换行符 '\n'?的主要内容,如果未能解决你的问题,请参考以下文章