Substituir uma linha específica mantendo a identificação

1

Eu tenho um arquivo que tem recuo.
Eu quero substituir uma linha específica, mas manter o recuo.
O arquivo tem uma linha como

   \t\t     customerId = "123" // has indentation in the start of line

Estou executando isso:

sed  -e 's:^\s*customerId = "'${OLD_ID}'": customerId = "'${NEW_ID}':' file

Isso não faz nada. Também estou ciente de que, mesmo que funcionasse, eu estragaria o recuo. Como posso corrigir isso?
Observação: A solução não precisa ser sed , mas eu gostaria que ela pudesse ser compatível com várias plataformas

UPDATE
Resposta testada @Gilles Quenot:

OLD_ID="1234"  
NEW_ID="5678"  
sed -E -i.bk "s:^(\s*)versionName = \"$OLD_ID\":versionName = \"$NEW_ID\":"   testfile   

Teste de amostra:

name="Jim"
    customerId = "1234"

O número não foi substituído

    
por Jim 28.03.2018 / 14:52

2 respostas

2

Usando o padrão sed :

sed "s:^\([[:blank:]]*customerId = \)\"$OLDID\":\"$NEWID\":" file

O padrão [:blank:] corresponderá a um único espaço ou caractere de tabulação.

A expressão sed captura tudo na linha até a própria ID e a substitui pelo que foi capturado e pela nova ID.

Um pouco mais bonito, possivelmente,

sed 's:^\([[:blank:]]*customerId = \)"'"$OLDID"'":"'"$NEWID"'":' file

Teste:

$ cat file
name="Jim"
    customerId = "1234"

$ OLDID=1234
$ NEWID=321

$ sed 's:^\([[:blank:]]*customerId = \)"'"$OLDID"'":"'"$NEWID"'":' file
name="Jim"
    customerId = "321"

Se os espaços em torno do = forem opcionais, talvez você queira usar

sed 's:^\([[:blank:]]*customerId *= *\)"'"$OLDID"'":"'"$NEWID"'":' file

Outra abordagem sugerida por don_crissti nos comentários:

sed '/customerId *=/s/"'"$OLDID"'"/"'"$NEWID"'"/' file

Isso tem o benefício de não precisar de um grupo de captura. Isso procura linhas contendo a palavra customerId seguida por um sinal de igual e substitui as IDs nessas linhas.

    
por 28.03.2018 / 15:06
1
sed -E "s:^(\s*)customerId = \"$OLD_ID\":customerId = \"$NEW_ID\":" file
    
por 28.03.2018 / 14:58