使用 grep 搜索精确数字

KLM*_*LMM 5 grep

我试图在文件中查找包含一个或多个 实例的行1234,但没有其他数字(允许使用非数字字符)。任何其他数字都应导致该行不匹配。

有效示例:

  • 1234
  • 1234 xxx
  • xxx 1234
  • 1234 1234
  • 1234 xxx 1234

无效的例子:

  • 12341234
  • 12345
  • 1234xxx345
  • 1234 345
  • 1234xxx
  • xxx1234
  • 1234xxx1234

这是我用过的:

grep -E '^([^0-9]*1234)+[^0-9]*$' file.txt
Run Code Online (Sandbox Code Playgroud)

但是这个命令也输出 12341234 作为有效,我该如何防止?

iru*_*var 5

awk可能比grep这更方便。将字段分隔符设置为非数字字符的运行,然后遍历字段并仅在每个非空字段完全等于时打印行1234

awk -F'[^[:digit:]]+' '{
  for(i=1; i<=NF; ++i) 
  if (($i) && ($i != 1234)) next
  }; {print}' file.txt
Run Code Online (Sandbox Code Playgroud)


Spa*_*awk 4

grep -E '^[^0-9]*1234([^0-9]+1234)*[^0-9]*$' file.txt
Run Code Online (Sandbox Code Playgroud)

解释

  • ^[^0-9]*1234:查找 的第一个匹配项1234,该匹配项前面可能有非数字字符。
  • ([^0-9]+1234)*: 可能会有进一步的迭代1234,但必须用非数字字符与第一个1234(和其他)分隔(因此使用)。1234+
  • [^0-9]*$:匹配整行(带$)。结尾后面可能有非数字字符1234(但不一定,因此*)。

编辑

如果1234必须用空格分隔(或者位于行首或行尾),则使用

grep -E '^([^0-9]* )?1234(( [^0-9]*)? 1234)*( [^0-9]*)?$'
Run Code Online (Sandbox Code Playgroud)

解释

  • ^([^0-9]* )?:可以有非数字字符开头,只要以空格结尾即可。
  • 1234:找到 的第一个(必需)匹配项1234
  • (( [^0-9]*)? 1234)*:我将向后遍历括号。可能有(零个或多个)进一步的副本1234,但这些副本之前必须有一个空格,即1234。在这个空格之前,可以有非数字字符,只要这些字符与前面的副本之间1243用另一个空格分隔即可,即( [^0-9]*)?
  • ( [^0-9]*)?$:可以有非数字字符结尾,只要它们前面有一个空格即可。