一个衬垫重新排列匹配项目的字段

时间:2016-03-17 03:13:02

标签: regex perl shell awk sed

重新安排符合条件的字段的智能,简洁/简洁方法是什么?就我的目的而言,记录可以是用空行分隔的块,例如:

apple
banana
12345
carrot

donut
98765
eggplant

或制表符分隔,例如,

apple   banana   12345   carrot
donut   98765   eggplant

在任何一种情况下,假设我正在寻找模式/[0-9]{5}/。如果匹配,我想将其移动到第一条记录。这将产生以下结果:

12345
apple
banana
carrot

98765
donut
eggplant

或制表符分隔,例如,

12345   apple   banana   carrot
98765   donut   eggplant

无需支持这两种格式。它们对我来说是可以互换的。

单线优先。

3 个答案:

答案 0 :(得分:1)

awk 'function out() {if (x) {print x; x="";}}
  NF==0 {out(); print; next}
  /^[0-9]{5}$/ {print; out(); next}
  {x=x?(x RS $0):$0}
  END {out()}'

答案 1 :(得分:1)

对于全部一线版本,请尝试(未经测试):

{{1}}

假设您只想移动5位数字,而不是包含 5位数字。

答案 2 :(得分:0)

对于你的第一个例子,一个可以工作的衬里将是:

perl -00 -pe "s/\A(.*?)^(\d{5}\n)/$2$1/sm" j1.txt

要在unix系统上运行,请用单引号替换双引号。

更新:对正则表达式进行了2次更改。