
Preciso usar regex para remover todo o texto começando no final da linha e voltando dois pontos.
gtk2-2.24.22-2.fc20.x86_64
torna-se
gtk2-2.24.22-2
Esta é a saída de rpm -qa
um arquivo de texto e preciso cortar o final.
Responder1
Vocêprecisaruma regex? Eu sei que esta é uma solução um pouco barata, mas expressões regulares não são uma solução para tudo.
Por exemplo, com manipulação de string Bash:
foo="gtk2-2.24.22-2.fc20.x86_64"
echo ${foo%.*.*} # strip the longest match from the last dot
Retorna gtk2-2.24.22-2
.
Você pode chamar isso em um arquivo assim:
foo=$(head -1 file.txt)
echo ${foo%.*.*} > new-file.txt
Expressões regulares são boas para analisar algo desde o início, não de trás para frente, pois consomem de maneira "ganancioso" da esquerda para a direita. É possível, mas você precisa ser um pouco mais detalhado do que faria no Bash simples.
Observe que o que parece ser uma regex no Bash ( .*
) não é uma expressão regular “real”. Em uma regex real, o ponto .
representa todos os caracteres e *
significa que o caractere anterior (grupo) é repetido de 0 a n vezes. No entanto, no Bash, o ponto .
significa um ponto real e *
é um curinga para todos os caracteres.