sed não distingue entre correspondência completa de regex e nenhuma correspondência

sed não distingue entre correspondência completa de regex e nenhuma correspondência

Quero extrair parte de uma string que corresponda a uma regex. Considere o seguinte código que funciona corretamente:

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

A saída é:

ss

No entanto, se a regex não 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 devolvido. Como pode ser isto alcançado?

Responder1

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

regex="ss"
string="blossom"
echo $string | sed -n "s/^.*\($regex\).*$/\1/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 ela corresponder a alguma coisa.

Responder2

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

Responder3

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

Responder4

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

[[ $string == *$regex*  ]] && echo $regex

informação relacionada