按班次提取捕获组

时间:2018-12-08 17:03:12

标签: unix sed terminal

我在弄清楚如何从文本文件中捕获两个以移位顺序排列的模式并以相同顺序打印它们时遇到了一些麻烦。例如,我们有以下文本文件:

13234::ABC
ABDE:1234
123::DUF

如果我想这样输出它会怎样:

13234 ABC
1234 ABDE
123 DUF

意思是,我想首先找到所有数字,然后再找到所有字符,无论它们在文本文件中的排列顺序如何,然后输出数字后跟字符。

我将如何去做?我只能弄清楚如果它们在文本文件中的顺序总是相同的,该怎么做。

5 个答案:

答案 0 :(得分:3)

sed 解决方案(考虑到只能有一个数字序列):

sed -r 's/([0-9]*):*([a-zA-Z]+):*([0-9]*)/\1\3 \2/' inputfile

输出:

13234 ABC
1234 ABDE
123 DUF

答案 1 :(得分:0)

考虑到您的Input_file与显示的示例相同。如果您对awk感到满意,请尝试执行以下操作。

awk '
match($0,/[0-9]+/){
  dig=substr($0,RSTART,RLENGTH)
}
match($0,/[a-zA-Z]+/){
  print dig, substr($0,RSTART,RLENGTH)
  dig=""
}
'  Input_file

输出如下。

13234 ABC
1234 ABDE
123 DUF

答案 2 :(得分:0)

如果您对awk解决方案感兴趣

awk -F ":+" '($1+0==$1){print $1,$2; next}{print $2,$1}'

想法是检查第一列是否为数字,是否打印原始顺序,否则将其反转。

答案 3 :(得分:0)

这可能对您有用(GNU sed):

sed 'h;s/[^[:alpha:]]//g;x;s/[^[:digit:]]//g;G;s/\n/ /' file

将问题分成两部分:复制当前行,从第一行中除去字母字符,然后从第二行中除去数字,然后将第一行附加到第二行,并将换行符替换为空格。

答案 4 :(得分:-1)

使用Perl

$ cat lunark.txt
13234::ABC
ABDE:1234
123::DUF
$ perl -F"/:+/" -alne ' print $F[0]=~/\d+/ ? "$F[0] $F[1]" : "$F[1] $F[0]" ' lunark.txt
13234 ABC
1234 ABDE
123 DUF
$