sed não faz distinção entre correspondência regex completa e nenhuma correspondência

3

Eu quero extrair parte de uma string correspondente a uma expressão regular. Considere o seguinte código que funciona corretamente:

regex="ss"
string="blossom"
echo $string | sed "s/^.*\($regex\).*$//"

A saída é:

ss

No entanto, se a regex corresponder a nada, toda a string será retornada.

regex="aa"

Saída:

blossom

Isso está incorreto. Quando não há correspondência, nada deve ser retornado. Como isso pode ser feito?

    
por Kshitiz Sharma 06.11.2015 / 14:51

4 respostas

5

Como disse a choroba, sed sempre imprimirá a linha, por padrão, com quaisquer substituições correspondentes. Você pode fazer o que quiser com:

regex="ss"
string="blossom"
echo $string | sed -n "s/^.*\($regex\).*$//p"

O -n diz ao sed para não imprimir a linha, então o p no final do comando s / diz ao sed para imprimir a linha, com substituições, se corresponder a alguma coisa.

    
por 06.11.2015 / 16:47
2

Sua interpretação está errada. Você disse a sed para substituir algo por outra coisa; não encontrou nada para substituir, por que deveria deletar alguma coisa? Em outras palavras, a substituição substitui o que corresponde, não toca em linhas não correspondentes. Ou, ainda, outra reformulação: sed substituiu corretamente todas as linhas contendo aa por aa .

    
por 06.11.2015 / 14:56
0

o comportamento do sed está correto, imprima a string de entrada EDITED. obviamente, se nada corresponder na cadeia de entrada com o token fornecido, o resultado será a cadeia de entrada como está. quando regex="aa" o token avaliado não combina e imprime="flor".

    
por 22.03.2017 / 14:18
-1

O seguinte deve funcionar se você quiser usar o 'sed':

[[ $string == *$regex*  ]] && echo $regex
    
por 06.11.2015 / 15:25

Tags