Usando sed com o agrupamento de padrões:
sed -r 's/(.*=)D(:\[^\]+)(\.*)/E/' file.txt
-
Todos os
()estão indicando grupos de padrões, o objetivo do agrupamento é usá-los na substituição usando apenas\#reference (substitua#pelo número do grupo, incrementando de 1, da esquerda para a direita) -
(.*=)corresponderá à parte anterior à primeiraD, isso é referenciado como grupo 1, ou seja,na substituição -
(:\[^\]+)corresponde até o segundo\apósD, isso é -
(\.*)corresponde a todo o restante após o segundo\(inclusive), isso é
Exemplo:
$ cat file.txt
Dir=D:\test\foo
Dir=D:\test\bar
$ sed -r 's/(.*=)D(:\[^\]+)(\.*)/E/' file.txt
Dir=E:\test1\foo
Dir=E:\test1\bar
Se você tiver várias ocorrências e quiser substituí-las:
$ cat file.txt
Dir=D:\test\foo Dir=D:\bar\foo
Dir=D:\test\bar
$ sed -r 's/D(:\)[^\]+/Etest1/g' file.txt
Dir=E:\test1\foo Dir=E:\test1\foo
Dir=E:\test1\bar