【问题标题】:Extracting capture groups in shifting order按顺序提取捕获组
【发布时间】:2019-05-10 02:58:37
【问题描述】:

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

13234::ABC
ABDE:1234
123::DUF

如果我想这样输出呢:

13234 ABC
1234 ABDE
123 DUF

意思是,我想先找到所有的数字,然后是所有的字符,不管它们在文本文件中的顺序是什么,然后输出数字后跟字符。

我该怎么做呢?如果它们在文本文件中总是以相同的顺序出现,我只能弄清楚如何做到这一点。

【问题讨论】:

  • 欢迎来到 SO。 Stack Overflow 是一个专为专业和热情的程序员准备的问答页面。将您自己的代码添加到您的问题中。您应该至少展示自己为解决这个问题所做的研究。

标签: unix sed terminal


【解决方案1】:

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

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

输出:

13234 ABC
1234 ABDE
123 DUF

【讨论】:

    【解决方案2】:

    考虑到您的 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
    

    【讨论】:

      【解决方案3】:

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

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

      思路是检查第一列是否为数字,如果是打印原顺序,否则反转。

      【讨论】:

        【解决方案4】:

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

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

        将问题分成两部分:复制当前行,从第一行中删除除字母字符之外的所有内容,从第二个中删除除数字之外的所有内容,将第一个附加到第二个并用空格替换换行符。

        【讨论】:

          【解决方案5】:

          使用 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
          $
          

          【讨论】:

            猜你喜欢
            • 2020-02-16
            • 1970-01-01
            • 1970-01-01
            • 2018-10-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多