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 sed
para 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 aa
por 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