尝试使用sed

时间:2017-02-10 22:20:02

标签: linux bash shell sed scripting

我尝试选择所有电子邮件地址,然后使用sed将它们移到行尾。我已经成功地找到了如何选择电子邮件地址,但除了将$追加到最后之外什么都没做 - 有没有办法将& (粘贴在选定的单词中)和$(转到行尾)操作符来完成我想要做的事情?或者我应该寻找不同的方法?

-bash-3.2$ sed "s/[a-z]*@*\.*\.[a-z].[a-z]/& $/" address
Xiao Li, lxiao@unc.edu $, 6705462234, Jackson, NC 764
Elizi Moe, emoe@ncsu.edu $, 5208534566, Tempe, AZ 85282
Ma Ta, mta@yahoo.com $, 4345667345, Austin, TX 91030
Diana Cheng, dcheng@asu.edu $, 5203456789, Matitsi, WY 4587
Jackson Five, jfive@ncsu.edu $, 5206564573, Kyenta, AZ 85483
Adi Srikanth Reddy, sadi1@imap1.asu $.edu, 6578904566, Wyo, WS 67854
Natkin William, wnatkin@imap28.asu $.edu, 8044344528, Richmond, VA 22345

*注意:这些是假名,地址和电话号码。

2 个答案:

答案 0 :(得分:3)

你可以试试这个sed命令:

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

<强>解释

  • $^([^,]+)捕获从第一行开始到第一列逗号(即第一列)到\1
  • 的所有内容
  • (,[^,]+)捕获第一个逗号和所有内容,但不包括第二个逗号到\2(即第二列,电子邮件)
  • (.*)将其余内容捕获到\3
  • 然后使用\1\3\2反向引用将列交换到括号标记的捕获组

答案 1 :(得分:0)

同样你也可以用perl来做这件事。

%_Host@User:/home/Gaurava/study/temp> perl -pe 's/^(.+?),(.+?),(.+)$/$1,$3,$2/g' names.txt
Xiao Li, 6705462234, Jackson, NC 764, lxiao@unc.edu $
Elizi Moe, 5208534566, Tempe, AZ 85282, emoe@ncsu.edu $
Ma Ta, 4345667345, Austin, TX 91030, mta@yahoo.com $
Diana Cheng, 5203456789, Matitsi, WY 4587, dcheng@asu.edu $
Jackson Five, 5206564573, Kyenta, AZ 85483, jfive@ncsu.edu $
Adi Srikanth Reddy, 6578904566, Wyo, WS 67854, sadi1@imap1.asu $.edu
Natkin William, 8044344528, Richmond, VA 22345, wnatkin@imap28.asu $.edu
%_Host@User:/home/Gaurava/study/temp>