2016-06-06 11 views
5

Hãy nói rằng chúng ta có một chuỗi dài ansible biến mystr. Chúng tôi có một mô hình regex nói substr_pattern và một chuỗi con phù hợp với mô hình này sẽ được lọc ra từ mystr và được gán cho một biến khác substr. Có vẻ là không có cách nào rõ ràng để làm điều này trong ansible từ các tài liệu trên playbook_filters mặc dù nó rất đơn giản để làm điều này với re mô-đun của riêng mình trăn.Lọc một chuỗi con phù hợp với một mô hình từ một biến ansible và gán chuỗi phù hợp với một biến khác

Có 3 phương pháp trình bày trong các tài liệu ansible và không ai trong số họ có vẻ để giải quyết vấn đề của tôi:

  1. match: Bộ lọc này trả về đúng/sai tùy thuộc vào việc toàn bộ mô hình phù hợp với toàn bộ chuỗi nhưng không không trả lại nhóm/chuỗi con phù hợp.

  2. search: Được sử dụng để lọc substr trong một chuỗi lớn hơn. Nhưng giống như match, chỉ trả về đúng/sai và không khớp nhóm/chuỗi con cần thiết ở đây.

  3. regex_replace: Điều này được sử dụng để thay thế mẫu phù hợp trong chuỗi bằng một chuỗi khác. Nhưng không rõ cách đăng ký chuỗi con/nhóm tương ứng với mẫu phù hợp vào một biến mới.

Có điều gì tôi thiếu không? Hoặc đây có phải là một tính năng thiếu trong ansible?

Ansible Version: 2,1

Ví dụ:

mystr: "This is the long string. With a url. http://example.org/12345" 
pattern: "http:\/\/example.org\/(\d+)" 
substr: 12345 # First matched group i.e. \\1 

Tóm tắt: Làm thế nào để có được những chuỗi phù hợp với pattern từ mystr và đăng ký đó để một ansible biến substr?

Trả lời

9

Nếu bạn có thể sửa đổi các mô hình, bạn có thể sử dụng bộ lọc regex_replace và thay thế toàn bộ chuỗi với chỉ các chữ số phù hợp.

mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') 

Để gán kết quả cho biến mới, bạn có thể sử dụng mô-đun set_fact.

- set_fact: 
    substr: "{{ mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') }}" 
+0

Điều này thật tuyệt vời và đơn giản. Tôi tự hỏi tại sao điều này đã không đến với tâm trí của tôi trước khi gửi bài! Sẽ vẫn hy vọng ansible thêm một số bộ lọc cho phép chụp các nhóm phù hợp trực tiếp. giải pháp của bạn là không siêu rõ ràng với tôi lần đầu tiên, kể từ khi xuất phát từ trăn tôi đã giả định có một cách để truy cập vào các nhóm phù hợp trực tiếp như 'match_obj.groups() [index]' –

Các vấn đề liên quan