Ansible使用split处理字符串无法移除\r回车符如何解决
为什么你现在的结果带多余的
\r 两个核心问题卡着,才会出现你看到的返回结果:
- 变量名笔误:
slurp模块注册的临时变量是file_names,但后续Jinja逻辑里写的是引用file_name,虽然没直接报错,但本身变量引用不严谨 - 拆分逻辑没适配Windows生成的文本:Windows导出的文本每行默认是
\r\n换行,你之前的写法里:trim过滤器只管整个字符串首尾的空白,根本碰不到每一行末尾夹着的\r- 手动写
split('\r\n')太脆了,只要文件里有几行的换行格式不标准,拆分出来的元素就会残留\r,刚好就出现你看到的前两个元素带\r、最后一个不带的不对称结果。
可直接用的修复方案
方案1:全局清理回车后拆行(最省心)
直接在解码Base64内容后,把所有\r字符全部移除,再做行拆分,全程不用手动判断分隔符格式,处理Windows生成的纯文件名列表完全够用:
tasks: - name: Getting the file ansible.builtin.slurp: src: file-name.txt register: file_names - name: Saving the file names set_fact: file_name_list: >- {{ (file_names.content | b64decode | replace('\r', '')) .splitlines() | reject('match', '^$') | list }}
这部分逻辑的作用:
- 解码后先把所有位置的
\r全部替换为空,不管是行尾残留的还是格式异常的,全部清干净 - 用
splitlines()自动识别换行做拆分,兼容Windows(\r\n)、Linux(\n)、老Mac(\r)的所有文本换行格式,不用手写分隔符 reject('match', '^$')自动过滤文件里的空行,避免列表里出现无意义的空值。
方案2:逐元素清理行尾回车(兼容性更强)
如果担心全局替换会误删文件名本身合法包含的\r字符,可以在拆分列表后,只逐元素清理每个值行尾的\r,不会影响文件名中间的特殊字符:
- name: Saving the file names set_fact: file_name_list: >- {{ (file_names.content | b64decode) .splitlines() | map('regex_replace', '\r$', '') | reject('match', '^$') | list }}
两种方案执行完,最终得到的file_name_list都会是不带任何转义字符的纯文件名列表,和你预期的返回效果完全一致。
内容的提问来源于stack exchange,提问作者Abhishek Aditya
相关产品推荐
相关产品推荐

