У меня проблема с командой SED. Мне нужно заменить символ @ на строку и добавить строку в столбец в CSV-файле.

Так

foo@example.com 

Станет

foo_X_example.com@newdomain.com

Я использую следующую команду sed

sed -i .bak -E 's/([^,\n\“]*)@([^,\n\“]*)/\1_X_\2@newdomain.com/' Test.csv

Но у меня есть новый разрыв строки где-то в команде, так

foo_X_exxample.com
@newdomain.com

Кто-нибудь может посоветовать, где ошибка в моей команде SED?

1 ответ1

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .