使用sed重新排列和删除字段

时间:2017-12-07 00:53:31

标签: bash sed

我需要帮助创建一个sed命令,它会重新排列下面文件中的字段,以便它们用冒号分隔,并且它们的顺序重新排列到此state:lastName:restOfName:city(街道地址被删除)。< / p>

Mickey Mouse, 1111 Disney Dr., Orlando FL 
Minnie Mouse, 1112 Disney Dr., Anaheim CA
Adam Voter, 902 Biscayne Blvd., Miami FL

当它们完成时,它们应该看起来像这样。

FL:Mouse:Mickey:Orlando
CA:Mouse:Minnie:Anaheim
FL:Voter:Adam:Miami

这是家庭作业,我只能使用sed。

1 个答案:

答案 0 :(得分:0)

您可以使用以下sed命令,如果您需要其他解释,请与我们联系:

sed -E -i.bak 's/^([^\s]*)\s+([^,]*),[^,]*,\s*([^\s]*)\s+([^\s]*)\s*$/\4:\2:\1:\3/g' test_add_file.in;

测试:

enter image description here

简而言之,您定义了sed将用于查看文本文件以获取所需模式的正则表达式,然后使用backreferences重用已在文件中识别的实际模式这个过程。

有关正则表达式的确切语法,请查看此链接:

http://www.rexegg.com/regex-quickstart.html

不久:

  • ^行开头修复模式的开头
  • ([^\s]*)用于获取Mickey, Minnie,...(重复0到N非空白字符,它们将在括号之间,因为它将被重新用作后面的参考
  • \s+ Mickey and Mouse
  • 之间有1个或多个空格
  • ([^,]*)将匹配字符串的Mouse部分(重复0到N非逗号字符)
  • ,[^,]*,\s*介于未使用的逗号, 1112 Disney Dr.,
  • 之间
  • ([^\s]*)用于获取Orlando, Anaheim
  • \s+ Orlando and FL
  • 之间有1个或多个空格
  • ([^\s]*)用于获取FL, CA, ...
  • \s*$使用$ EOL修复模式结尾,最后有空格

然后在sed命令的替换部分中重新排序模式,并在\4:\2:\1:\3

之间将列添加到它们之间