sed substituir problema

0

Meu arquivo contém

$Param_T=ABC49_SA_T2
$Param_V=ABC49BC_SA_V2
$Param_ST=ABC491_SA_M2

Eu estou tentando substituir um valor começa com ABC * _ com XYZ12 _

sed -i 's/ABC\.*_/XYZ12_/g' INCR.parm

Acima está o comando sed que eu usei. Não está jogando nenhum erro, mas o valor não está mudando. Alguém poderia me ajudar com isso?

    
por user_297020 28.06.2018 / 12:45

2 respostas

1

Com sed, a maneira de implementar correspondência não-gulosa é especificar um conjunto de caracteres que você não deseja corresponder:

sed -i 's/=ABC[^_]*_/=XYZ12_/g' INCR.parm

Ou seja: corresponde "ABC" seguido por zero ou mais caracteres não sublinhados seguidos por sublinhado.

E note que você não escapa do ponto. Um ponto "nu" significa "corresponde a qualquer caractere"; um ponto de escape significa "corresponde a um ponto literal". Você não estava fazendo nenhuma substituição porque nenhum dos dados corresponde à string literal "ABC".

    
por 28.06.2018 / 15:15
0

Não escape do " . " que corresponde a todos os caracteres [ Greedy ]

sed -i 's/ABC.*_/XYZ12_/g' INCR.parm

Saída:

$Param_T=XYZ12_T2
$Param_V=XYZ12_V2
$Param_ST=XYZ12_M2)

Se você quiser substituir ABC * somente até o primeiro sublinhado ( _ ) [Preguiçoso], você precisa usar perl regex

use

perl -pe  's/ABC(.*?)_/XYZ12_/g' INCR.parm

Saída:

$Param_T=XYZ12_SA_T2
$Param_V=XYZ12_SA_V2
$Param_ST=XYZ12_T2

'Greedy' means match longest possible string.

'Lazy' means match shortest possible string.

    
por 28.06.2018 / 12:50