【问题标题】:How to escape 1 or more whitespaces in a regex in the lineinfile module of Ansible?如何在 Ansible 的 lineinfile 模块中的正则表达式中转义 1 个或多个空格?
【发布时间】:2016-07-20 15:57:43
【问题描述】:

我正在使用 Ansible 通过 lineinfile 模块在文件上设置一些变量。 我遇到的问题是如何拥有一个足够灵活的正则表达式,以便在字符串中间有一些空格。请看下面:

- name: Set DB IP in db conn file
  lineinfile: 
    dest=/path/to/db_conn
    regexp="{{ item.regexp }}"
    line="{{ item.line }}"
  with_items:
    - { regexp: "^.?dbschema_audit=",
        line: "$dbschema_audit=\'{{ db_schema_audit }}\';" }
    - { regexp: "^.?dbschema_audit_trail\s\*=",
        line: "$dbschema_audit_trail=\'{{ db_schema_audit_trail }}\';" }

我要更改的文件有如下几行:

$dbschema_audit='a';
$dbschema_audit_trail ='a';

我尝试了\s*{'\ 的不同变体,但似乎没有任何效果。我可以从那里获得一些智慧吗?

【问题讨论】:

  • \s\* 将匹配一个空格和一个 * 字面意思。 \s* 将匹配 0 到 N 个空格字符。
  • 我也是这么想的。问题是,Ansible/YAML 不喜欢这种表示法:“违规行似乎是:- { regexp: "^\\$dbschema_audit\s*=", line: "$dbschema_audit=\'{{ db_schema_audit }}\ ';" } "
  • 试试regexp: "^.?dbschema_audit\s{0,}="regexp: "^.?dbschema_audit[ \t\r\n\f\v]{0,}="

标签: regex yaml ansible


【解决方案1】:

Ansible 剧本采用 YAML 格式。在双引号标量中,以\ 字符开头的字符序列是转义序列,但YAML specification 表示\s 不是有效的转义序列。

在双引号标量中,你必须写

"\\s"

或者,在单引号标量中,\ 字符没有特殊含义,所以你可以写

'\s'

【讨论】:

  • 谢谢,就是这样! regexp: "^\\$dbschema_audit_trail\\s*=" 工作
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多