嗨,我正在从文件中读取内容。
文件包含以下内容。
======
界面和
public void and(int,int);
public void nand(int,int);
======
界面或
public void or(int, int); public void nor(int, int);
======
Xor界面
public void xor(int, int); public void xnor(int, int);
======
界面不
public void not(int);
======
BitWise类扩展了“或”,“或”,“不”
//接口的实现在这里
======
我正在尝试仅读取接口
我经历了这个How to read a particular part of file in ansible
---
- name: Read the Interfaces
hosts: 127.0.0.1
connection: local
vars:
- file_path: " {{ playbook_dir }}/input_file.txt"
- my_interfaces: []
tasks:
- name: Reading the interfaces
set_fact:
my_interfaces: "{{ my_interfaces + [ item ] }}"
with_lines: "cat {{file_path}}"
when: item is search('^interface.+?=*')
- name: Printing all the interfaces
debug:
var: my_interfaces
程序输出为
ok: [127.0.0.1] => {
"my_interfaces": [
"interface And",
"interface Or",
"interface Xor",
"interface Not"
]
}
但是所需的输出是
ok: [127.0.0.1] => {
"my_interfaces": [
"interface And \n public void and(int, int) \n public void nand(int, int)",
"interface Or \n public void or(int, int) \n public void nor(int, int)",
"interface Xor \n public void xor(int, int) \n public void xnor(int, int)",
"interface Not \n public void not(int)",
]
}
我认为我在正则表达式部分做错了。但我不知道如何纠正它以获得所需的输出。有人可以帮助我解决问题。除此之外,还有其他方法可以完成相同的任务。
答案 0 :(得分:1)
在您的模式^interface.+?=*
中,该部分.+?
是非贪婪的,因此引擎将至少匹配1次以上。 =*
这部分与等号匹配0次以上。
如果界面中没有等号,则如果点与换行符不匹配,它将只与interface
匹配,后跟一个空格。
如果要使用模式,必须启用点与换行符的匹配(如果支持,请使用内联修饰符(?s)
)。使用捕获组或正向前行使其与换行符和等号不匹配,但要确保它在那里。
(?s)^interface\b.+?(?=\r?\n=)
另一个选择可能是匹配界面和该行的其余部分。然后,使用负前瞻(?!=)
^interface\b.*(?:\r?\n(?!=).*)*
答案 1 :(得分:1)
一旦您在 my_interfaces 中获得了标题列表,就有可能使用 sed 并打印行的范围。
以下任务
- command: "sed -n '/{{ item }}/,/======/p' {{ file_path }}"
register: result
loop: "{{ my_interfaces }}"
- set_fact:
my_ifc: "{{ my_ifc|default([]) + [ item.stdout_lines ] }}"
loop: "{{ result.results }}"
- debug:
var: my_ifc
给予
"my_ifc": [
[
"interface And",
"",
"public void and(int, int);",
"",
"public void nand(int, int);",
"",
"======"
],
[
"interface Or",
"",
" public void or(int, int);",
"",
" public void nor(int, int);",
"======"
],
[
"interface Xor",
"",
" public void xor(int, int);",
"",
" public void xnor(int, int);",
"======"
],
[
"interface Not",
"",
" public void not(int);",
"======"
]
]
(格式化wip ...)
答案 2 :(得分:1)
---
- hosts: localhost
gather_facts: false
vars:
content: "{{ lookup('file', 'filename') }}"
tasks:
- name: "split file into blocks"
set_fact:
content: "{{ content.split('======') }}"
- debug:
msg: "{{ content }}"
- name: "remove white space from start and end of blocks"
set_fact:
content: "{{ content | map('trim') | list}}"
- debug:
msg: "{{ content }}"
- name: "select blocks that start with interface"
set_fact:
content: "{{ content | select('search', '^interface') | list}}"
- debug:
msg: "{{ content }}"
您还可以在一个命令中组合所有步骤:
---
- hosts: localhost
gather_facts: false
vars:
content: "{{ lookup('file', 'filename') }}"
tasks:
- name: "fetch interfaces"
set_fact:
content: "{{ content.split('======') | map('trim') | select('search', '^interface') | list }}"
- debug:
msg: "{{ content }}"
这将返回:
[u'interface And\n\npublic void and(int, int);\n\npublic void nand(int, int);',
u'interface Or\n\n public void or(int, int);\n\n public void nor(int, int);',
u'interface Xor\n\n public void xor(int, int);\n\n public void xnor(int, int);',
u'interface Not\n\n public void not(int);']