2017-02-10 40 views
0

我試圖選擇所有電子郵件地址並將它們移動到使用sed的行末尾。我已經成功地想出瞭如何選擇電子郵件地址,但除了追加$到最後什麼都沒有做到 - 有沒有辦法將&(粘貼回選定的單詞)和$(到行尾)運營商完成我期待的目標?或者我應該尋找一種不同的方法?試圖將單詞移動到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> 
相關問題