Похоже, что ваш оригинальный файл 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
будет соответствовать только в пределах одной строки, а не через новые строки.