Греп наказание между (и включая) две шаблоны

Я обнаружил, что использование скрипта Python является самым простым решением (проще, чем плагин обратного вызова, по крайней мере, в моей доступной версии 1.7):

#!/usr/bin/env python

from __future__ import print_function
import ansible.inventory
import ansible.runner                                                                                   
from subprocess import Popen, PIPE
import sys


TO = "root"


def message(subject, body):
    p = Popen(["mail", "-s", subject, TO], stdin=PIPE)                                                  
    p.communicate(input=body)                                                                           
    res = p.wait()                                                                                      
    if res != 0:
        print("Failed to send message", file=sys.stderr)                                                


def main():
    im = ansible.inventory.Inventory()                                                                  
    runner = ansible.runner.Runner(                                                                     
        module_name='command',                                                                          
        module_args='sh -c "echo OK"',                                                                  
        sudo=True,
    )                                                                                                   
    run = runner.run()
    nosudo = set(run["dark"].keys())

    runner = ansible.runner.Runner(
        module_name='command',
        module_args='sh -c "echo OK"',                                                                  
        sudo=False,
        inventory=ansible.inventory.Inventory(list(nosudo)),                                            
    )   
    run = runner.run()                                                                                  
    nonet = set(run["dark"].keys()) 

    nosudo = nosudo - nonet

    for host in nosudo:                                                                                 
        message("Host check: %s" % host,
                "Cannot execute 'sudo -u root ...' as user 'deploy'.")                                  
    for host in nonet:
        message("Host check: %s" % host,
                "Cannot login into the machine.")


if __name__ == '__main__':                                                                              
    main()      
2
06.08.2018, 19:38
4 ответа

Попробуйте использовать следующее регулярное выражение:https://www.instagram.com/p/[^/]\+/

#!/bin/bash
data="××××××https://www.instagram.com/p/BRhNDg5jne7/××××××××"
echo "$data" | grep -o 'https://www.instagram.com/p/[^/]\+/'

Волшебная часть — [^/]\+/, она захватывает все до следующей косой черты включительно.

Пример вывода приведенного выше скрипта.

zb@server ~ $./tmp.sh 
https://www.instagram.com/p/BRhNDg5jne7/
1
27.01.2020, 22:09

РЕДАКТИРОВАТЬ :, поскольку вопрос претерпел некоторые изменения с тех пор, как я опубликовал свой ответ, изменилось и мое понимание этого вопроса.

Если все ваши строки имеют шаблон xxxx, то все, что вам нужно сделать, это заменить регулярное выражение на sed. т.е.:

sed 's/xxxx*//g'

Если вам сначала нужно grepстроки, затем передайте sedпосле grep. т.е.:

grep "https://www.instagram.com/p/" | sed 's/xxxx*//g'

В зависимости от того, какой у вас реальный паттерн, этот подход может быть полезен, а может и нет.

0
27.01.2020, 22:09

Использование grep:

echo "××××××https://www.instagram.com/p/BRhNDg5jne7/××××××××"  | grep -Po "(?s)(http(.*?)(\/p\/.*\/|\/\Z))"

выход:

https://www.instagram.com/p/BRhNDg5jne7/
1
27.01.2020, 22:09

нет необходимости в регулярном выражении perl Вы можете попробовать:

grep -o "https://www.instagram.com/.*/"
0
27.01.2020, 22:09

Теги

Похожие вопросы