Linux 正在尝试使用sed将单词移动到行尾

Linux 正在尝试使用sed将单词移动到行尾,linux,bash,shell,sed,scripting,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 Eli

我正在尝试选择所有电子邮件地址,并使用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

*注意:这些是错误的姓名、地址和电话号码。

您可以尝试此sed命令:

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

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

类似地,您也可以使用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>

成功了!请您解释一下如何使用\1\3\2,或者至少解释一下\1\3\2的用途好吗?谢谢!!!这是一种非常有效的将数据拆分为列以进行操作的方法—我会记住这一点。@IAspireToBeGladOS只要列中没有逗号,它就可以工作,我不知道当某些列为空时它的工作情况如何。这取决于文件的格式。问题中的sed命令不起作用,因为
&
只匹配电子邮件列,
&$
附加一个普通的美元符号。你不能移动柱子。因此,您需要将电子邮件的左右部分与捕获组相匹配,并与反向引用交换这些部分。@Larsficher非常棒,非常了解
sed