grep单个数字出现一次

时间:2017-08-28 10:09:31

标签: regex unix grep

我需要一个grep命令的帮助 - 单个数字一次排成一行 我的解决方案不起作用

egrep "^(\s*[1]\s*)(\s*[^1]+\s*)+$|^(\s*[^1]\s*)(\s*[1]+\s*)+$|^(\s*[2]\s*)(\s*[^2]+\s*)+$|^(\s*[^2]\s*)(\s*[2]+\s*)+$|^(\s*[3]\s*)(\s*[^3]+\s*)+$|^(\s*[^3]\s*)(\s*[3]+\s*)+$|^(\s*[4]\s*)(\s*[^4]+\s*)+$|^(\s*[^4]\s*)(\s*[4]+\s*)+$|^(\s*[5]\s*)(\s*[^5]+\s*)+$|^(\s*[^5]\s*)(\s*[5]+\s*)+$|^(\s*[6]\s*)(\s*[^6]+\s*)+$|^(\s*[^6]\s*)(\s*[6]+\s*)+$|^(\s*[7]\s*)(\s*[^7]+\s*)+$|^(\s*[^7]\s*)(\s*[7]+\s*)+$|^(\s*[8]\s*)(\s*[^8]+\s*)+$|^(\s*[^8]\s*)(\s*[8]+\s*)+$|^(\s*[9]\s*)(\s*[^9]+\s*)+$|^(\s*[^9]\s*)(\s*[9]+\s*)+$"
  例子

例如在本文中

012 210 5   
6343 232 5 3423  
345 689 7 986 543012 210 5  

grep颜色只有第二行。
我想要每行grep颜色,因为在每一行中任何一个数字都出现一次。在第一行中,这是第二行中的5,这是第三行中的5,这是7

3 个答案:

答案 0 :(得分:0)

我真的不确定预期的输出应该是什么(请直接更新它的问题),但这里使用的是GNU awk。第一个测试数据:

$ cat foo
012 210 5
6343 232 5 3423
345 689 7 986 543012 210 5
234 12 43

然后:

$ awk -F '' '{
    delete a
    for(i=1;i<=NF;i++)
        if($i~/[0-9]/)
            a[$i]++
        for(i in a)
            if(a[i]==1 && match($0, "[^" i "]*" i "[^" i "]*")) {
                print $0
                next      # second data line has 2 matches
            }
}' foo
012 210 5
6343 232 5 3423
345 689 7 986 543012 210 5
234 12 43

然后,它的缩短只是为了:

$ awk '{for(i=0;i<=9;i++)if(gsub(i,i,$0)==1){print;next}}' foo

答案 1 :(得分:0)

检测某个数字在某一行上是否唯一的模式(如果我正确理解了该问题):

对于数字5: ^[^5]*(5)[^5]*$

^     // start of line
[^5]* // any char not 5, 0-or-more
(5)   // 5
[^5]* // any char not 5, 0-or-more
$     // end of line

要测试所有数字,它将变为:

^(?:[^0]*(0)[^0]*|[^1]*(1)[^1]*)$等所有数字。该数字在第一组中捕获。

Demo

  • 步骤:509步
  • 标志:g,m

答案 2 :(得分:0)

我不完全确定您之后的内容,但如果匹配的行只包含一个数字实例,请尝试以下操作:

[^0]*0[^0]*|[^1]*1[^1]*|[^2]*2[^2]*|[^3]*3[^3]*|[^4]*4[^4]*|[^5]*5[^5]*|[^6]*6[^6]*|[^7]*7[^7]*|[^8]*8[^8]*|[^9]*9[^9]*

grep ified

grep -x "[^0]*0[^0]*\|[^1]*1[^1]*\|[^2]*2[^2]*\|[^3]*3[^3]*\|[^4]*4[^4]*\|[^5]*5[^5]*\|[^6]*6[^6]*\|[^7]*7[^7]*\|[^8]*8[^8]*\|[^9]*9[^9]*"

-x使grep与整行匹配。)

正则表达式使用10个相同的替换,每个数字一个。每个轮换

  • 确保零个或多个数字开始行。
  • 匹配一个允许的数字
  • 确保零个或多个数字结束该行。

See it here at regex101