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
Eu 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 consertar isso?
Nota: A solução não precisa ser sed
, mas eu gostaria que fosse multiplataforma
ATUALIZAÇÃO
Resposta testada de @Gilles Quenot:
OLD_ID="1234"
NEW_ID="5678"
sed -E -i.bk "s:^(\s*)versionName = \"$OLD_ID\":\1versionName = \"$NEW_ID\":" testfile
Teste de amostra:
name="Jim"
customerId = "1234"
O número não foi substituído
Usando padrão
sed
:O
[:blank:]
padrão corresponderá a um único espaço ou caractere de tabulação.A
sed
expressão captura tudo na linha até o próprio ID e o substitui pelo que foi capturado e pelo novo ID.Um pouco mais bonito, possivelmente,
Teste:
Se os espaços ao redor
=
forem opcionais, você pode querer usarOutra abordagem sugerida por don_crissti nos comentários:
Isso tem a vantagem de não precisar de um grupo de captura. Isso procura linhas contendo a palavra
customerId
seguida por um sinal de igual e substitui os IDs nessas linhas.