regex 使用Ansible删除文件中字符串之前的每一行

dgenwo3n  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(142)

我有下面的文件:

Scheduled jobs
Locale LANG set to the following: "en"
CONMAN:AWSBHU611W Conman could not initialize the HTTP or HTTPS connection.
Workstation Job Stream SchedTime Job State Pr Start Elapse ReturnCode Dependencies

HCPRODNWA #NW_HC_CA_BKP1 0106 02/13 **************************************** HOLD 10(02/13) (03:22)
NW_HC_CA_PREBKUP1B HOLD 10(02/13)(00:01)
NW_HC_CA_SANREPLICATION HOLD 10(02/13)(00:05)ΩNW_HC_CA_PREBKUP1B
NW_HC_CA_PPBACKUP HOLD 10(02/13)(03:17)
NW_HC_CA_SANREPLICATION
NW_HC_CA_GOLDCOPY HOLD 10(02/13)(00:01)
NW_HC_CA_SANREPLICATION

我想删除以“工作站作业...”开头的行之前的所有行
我的Ansible代码是:

- name: Extract job details
  replace:
    path: /tmp/tws_jobs
    after: '(^Scheduled)'
    before: '(^Workstation)'
    regexp: '^(.*)$'
    replace: ''

但我无法得到所需的输出。相反,我得到以下消息:

"msg": "Pattern for before/after params did not match the given file: (^Scheduled)(?P<subsection>.*?)(^Workstation)"
pbpqsu0x

pbpqsu0x1#

after: '(^Scheduled)'
    before: '(^Workstation)'

Q:***“之前/之后参数的模式与给定文件不匹配”***

更新(模块 * 替换 * 说明)

简短回答:^$匹配文件的开头和结尾。使用\n匹配一行的开头和结尾。下面的任务删除行 afterbefore 之间的行

- replace:
        path: /tmp/tws_jobs
        regexp: '.*'
        replace: ''
        after: '^Scheduled.*?\n'
        before: '\nWorkstation.*?\n'

--check --diff 中运行

--- before: /tmp/tws_jobs
+++ after: /tmp/tws_jobs
@@ -1,6 +1,6 @@
 Scheduled jobs
-Locale LANG set to the following: "en"
-CONMAN:AWSBHU611W Conman could not initialize the HTTP or HTTPS connection.
+
+
 Workstation Job Stream SchedTime Job State Pr Start Elapse ReturnCode Dependencies

详细信息:
文件的内容存储为字符串

contents = to_text(f.read(), errors='surrogate_or_strict', encoding=encoding)

给出了测试文件

shell> cat /tmp/test.txt 
aaa
bbb
ccc
ddd
eee

声明默认参数以简化测试

- hosts: localhost
  module_defaults:
    replace:
      path: /tmp/test.txt
      regexp: '.*'
      replace: ''
  tasks:
    - replace:
        ...

1.匹配文件和行的开头

  • ^a匹配文件开头的a
  • \n开始一个新行
after: '^a'
        before: '\nd'

给予

-aaa
-bbb
-ccc
+a
+
+
 ddd
 eee

1.匹配行的其余部分。在前面的示例中,第一行a之后的其余部分被删除。如果您想保留整行,请匹配其余部分。

  • after and before uses DOTALL quote:

使“.”特殊字符匹配任何字符,包括换行符

  • 非贪婪?匹配所有字符.*直到新行\n
after: '^a.*?\n'
        before: '\nd'

给予

aaa
-bbb
-ccc
+
+
 ddd
 eee

来源

答:beforeafter 模式都不匹配文件中的任何一行。正确的模式应该是

after: '^Scheduled(.*)$'
    before: '^Workstation(.*)$'

但是这些模式也不起作用,可能是因为存在开放问题Replace module before/after still broken #47917
可以在一个简化的示例中测试各种模式

shell> cat test.txt
aaa
bbb
ccc
ddd
eee

任务

- replace:
        path: test.txt
        after: 'bbb'
        before: 'ddd'
        regexp: '^(.*)$'
        replace: ''

按预期工作

shell> cat test.txt
aaa
bbb

ddd
eee

但都不是

- replace:
        path: test.txt
        after: '^bb'
        before: '^dd'
        regexp: '^(.*)$'
        replace: ''

也不是

- replace:
        path: test.txt
        after: '^bb(.*)$'
        before: '^dd(.*)$'
        regexp: '^(.*)$'
        replace: ''

更改文件中的任何内容

PLAY RECAP *************************************************************************
localhost: ok=1  changed=0  unreachable=0  failed=0  skipped=0  rescued=0  ignored=0

[1] https://github.com/ansible/ansible/issues/47917#issuecomment-686339762

vsikbqxv

vsikbqxv2#

尝试另一种方法:阻塞文件:

- name: Extract job details
  blockinfile:
    marker_begin: '^Scheduled'
    marker_end: '^Workstation'

相关问题