Com BSD sed ou versões recentes do GNU sed (para versões mais antigas, substitua -E por -r ):
sed -E 's#(.*\src).*(\[^\]+\[^\]+$)##' file.txt
-
#é usado como o comando delimitador para substituição (s) desed, para evitar ambigüidade envolvendo\s na entrada -
(.*\src)corresponde asrcdo início e coloca a correspondência no grupo capturado 1 -
(\[^\]+\[^\]+$)corresponde à parte que tem dois\s até o final e coloca no grupo capturado 2, o.*anterior a isso corresponde a tudo entre o primeiro e o segundo grupos capturados -
Na substituição, usamos os dois grupos capturados
POSIX-ly:
sed 's#\(.*\src\).*\(\[^\]\+\[^\]\+$\)##' file.txt
Exemplo:
% cat file.txt
..\..\src\modules\core\abc\abc.cpp
..\..\src\modules\core\something\xyz\xyz.cpp
..\..\src\other_modules\new_core\something\pqr\pqr.cpp
..\..\src\other_modules\new_core\something\pqr\abc.cpp
% sed -E 's#(.*\src).*(\[^\]+\[^\]+$)##' file.txt
..\..\src\abc\abc.cpp
..\..\src\xyz\xyz.cpp
..\..\src\pqr\pqr.cpp
..\..\src\pqr\abc.cpp