2017-02-10 11 views
0

Я пытаюсь выбрать все адреса электронной почты и переместить их в конец строки с помощью sed. Я успешно выяснил, как выбрать адреса электронной почты, но не может сделать ничего, кроме append $ до конца - есть ли способ объединить & (для вставки обратно в выбранные слова) и $ (для перехода к концу строки), чтобы выполнить то, что я ищу? Или я должен искать другой метод?Попытка переместить слово в конец строки с помощью sed

-bash-3.2$ sed "s/[a-z]*@*\.*\.[a-z].[a-z]/& $/" address 
Xiao Li, [email protected] $, 6705462234, Jackson, NC 764 
Elizi Moe, [email protected] $, 5208534566, Tempe, AZ 85282 
Ma Ta, [email protected] $, 4345667345, Austin, TX 91030 
Diana Cheng, [email protected] $, 5203456789, Matitsi, WY 4587 
Jackson Five, [email protected] $, 5206564573, Kyenta, AZ 85483 
Adi Srikanth Reddy, [email protected] $.edu, 6578904566, Wyo, WS 67854 
Natkin William, [email protected] $.edu, 8044344528, Richmond, VA 22345 

* Примечание: эти вымышленные имена, адреса & номера телефонов.

ответ

2

Вы можете попробовать эту SED команду:

sed -r "s/^([^,]+)(,[^,]+)(.*)/\1\3\2/g" address 

Объяснение

  • $^([^,]+) захватывает все от начала строки Шифрование до, но не включая первую запятую (т.е. первый столбец) в \1
  • (,[^,]+) захватывает первую запятую и все до, но не включая вторую запятую в \2 (т.е. второй столбец, электронная почта)
  • ^([^,]+) захватывает остальных в \3
  • то столбцы переставляются с помощью \1\3\2 обратной ссылки на группы захвата, отмеченных скобками
+0

Это сработало! Не могли бы вы объяснить, как или, по крайней мере, объяснить цель \ 1 \ 3 \ 2? – IAspireToBeGladOS

+0

Спасибо !!! Это действительно эффективный способ разделения данных на столбцы для манипуляций - я буду помнить об этом. – IAspireToBeGladOS

+0

@IAspireToBeGladOS Он работает до тех пор, пока в столбцах нет запятых, и я не знаю, насколько хорошо он будет работать, когда некоторые столбцы пустые. Это зависит от того, насколько хорошо файл отформатирован. Ваша команда sed из вопроса не работает, потому что '&' соответствует только столбцу электронной почты, '& $' добавляет литерный знак доллара. Вы не перемещаете столбец вокруг. Поэтому вам нужно сопоставить части слева и справа от электронной почты с группами захвата и поменять местами с помощью обратных ссылок. –

0

Аналогично вы можете сделать это с помощью Perl тоже. .

%[email protected]:/home/Gaurava/study/temp> perl -pe 's/^(.+?),(.+?),(.+)$/$1,$3,$2/g' names.txt 
Xiao Li, 6705462234, Jackson, NC 764, [email protected] $ 
Elizi Moe, 5208534566, Tempe, AZ 85282, [email protected] $ 
Ma Ta, 4345667345, Austin, TX 91030, [email protected] $ 
Diana Cheng, 5203456789, Matitsi, WY 4587, [email protected] $ 
Jackson Five, 5206564573, Kyenta, AZ 85483, [email protected] $ 
Adi Srikanth Reddy, 6578904566, Wyo, WS 67854, [email protected] $.edu 
Natkin William, 8044344528, Richmond, VA 22345, [email protected] $.edu 
%[email protected]:/home/Gaurava/study/temp>