Похоже, что ваш оригинальный файл test.csv отформатирован в Windows, с возвратом (0x0d или \r) и переводом строки (0x0a или \n) для каждой новой строки. Ваш шаблон поиска sed не исключает \r поэтому он будет сохранен во втором сопоставленном поле и выведен перед добавленным текстом.
Итак, ваша оригинальная команда:
sed -i .bak -E 's/([^,\n\“]*)@([^,\n\“]*)/\1_X_\2@newdomain.com/' Test.csv
дает выходной файл (используя od -c чтобы увидеть управляющие символы):
0000000 f o o _ X _ e x a m p l e . c o
0000020 m \r @ n e w d o m a i n . c o m
0000040 \n
Если вы добавите \r к исключенным символам:
sed -i .bak -E 's/([^,\r\n\“]*)@([^,\r\n\“]*)/\1_X_\2@newdomain.com/' Test.csv
затем сохраняется исходная последовательность новой строки:
0000000 f o o _ X _ e x a m p l e . c o
0000020 m @ n e w d o m a i n . c o m \r
0000040 \n
Обратите внимание, что вам не нужно \r или \n в первом соответствующем поле, так как эта форма команды sed будет соответствовать только в пределах одной строки, а не через новые строки.