Estou procurando substituir o texto dentro de um arquivo após um determinado padrão.
Por exemplo:
O conteúdo example.txt
é
Something==x.y.z
Eu gostaria de mudá-lo para
Something>=x.y.z,<x.y.z+1.0
Eu sei que posso usar sed -i 's/==/>=/g' example.txt
para alterar o ==
mas não sei adicionar <x.y.z+1.0
depois de um determinado padrão.
( Por favor, note que x.y.z
é um número aleatório )
EDIT: é para pacotes Python. Exemplos
argcomplete==1.12.3
youtube-dl==2021.6.6
systemd-python==234
se tornaria
argcomplete>=1.12.3,<1.12.3+1.0
youtube-dl>=2021.6.6,<2021.6.6+1.0
systemd-python>=234,<234+1.0
O
sed
comando a seguir assume que há exatamente um==
na linha e extrai as partes antes e depois dele como grupos 1 e 2 que podem ser usados na substituição.Com a entrada
a saída é
Para editar o arquivo no local, adicione a opção
-i
e o nome do arquivo de entrada:Explicação:
Padrão:
.
= qualquer caractere*
= o padrão anterior repetido de 0 a qualquer número.*
= qualquer número de quaisquer caracteres\(
...\)
= capturar o texto correspondente ao padrão incluído==
= texto literal\(.*\)==\(.*\)
= qualquer texto capturado como grupo 1 seguido por==
e qualquer texto capturado como grupo 2Substituição:
\1
,\2
= texto do grupo de captura 1 ou 2\1>=\2,<\2+1.0
= grupo 1>=
grupo2,<
grupo2+1.0
Como mencionado no comentário de they , o primeiro padrão antes do literal
==
pode ser omitido, resultando emA explicação é semelhante com a diferença que
sed
só modificará a parte correspondente da linha. Assim, a parte anterior==
será preservada, sendo==
necessário apenas um grupo de captura para a parte posterior.Uma diferença no comportamento dos dois padrões é que
.*==
... corresponderá ao último==
while==
... corresponderá ao primeiro porque a.*
parte corresponde ao texto mais longo possível que é seguido por==
.