grep - a escrita de padrões multilinha

1

Como posso escrever o padrão grep em várias linhas, dentro do script bash ? Assim:

grep -o -P '
    (?!<.*?(?<!(href))=")
        https?:\/\/(?!(www\.example\.com)).*?
    (?=(">))
' input.txt

Quando escrevi programas php , consegui fazê-lo. Agora tentei isso no script bash - não funciona. É muito difícil escrever tudo em uma linha: (

Pode existir opção, que permite a formatação dentro do padrão, isto é, grep não percebe espaços em branco (espaços e novas linhas), quando essa opção está ativada.

versão do grep:

grep -V
grep (GNU grep) 2.25
    
por MiniMax 14.06.2017 / 22:27

2 respostas

2

grep tem novas linhas como separando diferentes padrões. Mas você pode salvar o padrão em uma variável e, em seguida, remover o espaço em branco antes de passá-lo para grep :

$ ws=$' \t\n'
$ pat=$'a b\nc'
$ echo abcd | grep "${pat//[$'\n\t ']}"
abcd

(não testei com nada mais complexo).

    
por 14.06.2017 / 23:53
3

Mesmo com -P , que ativa (?x:) , você não pode ignorar as novas linhas. Para espaços e tabulações, funciona:

echo abab | grep -P $'(?x:a b a\tb)'

Mas a nova linha não funciona da mesma maneira:

echo ab | grep -P $'(?x:a\nb)'
grep: the -P option only supports a single pattern

Pelo menos no GNU grep 2.16.

    
por 14.06.2017 / 22:39