Linux 正在尝试使用sed将单词移动到行尾
我正在尝试选择所有电子邮件地址,并使用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
-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
%_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