编辑

编辑

我试图在文件中查找包含一个或多个 实例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

但是这个命令也输出 12341234 有效,我该如何防止这种情况呢?

答案1

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

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

答案2

grep -E '^[^0-9]*1234([^0-9]+1234)*[^0-9]*$' file.txt

解释

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

编辑

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

grep -E '^([^0-9]* )?1234(( [^0-9]*)? 1234)*( [^0-9]*)?$'

解释

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

答案3

在 ( ) 行的开头^或前面有一个非数字 ( [^0-9]) 搜索数字,同样在末尾 ($[^0-9]) 处搜索数字。

grep -E '(^|[^0-9])1234($|[^0-9])' file.txt

如果要允许前导零,请0*在数字前添加。

grep -E '(^|[^0-9])0*1234($|[^0-9])' file.txt

如果您还想拒绝包含不属于该特定数字出现部分的任何一个或多个数字序列的行,那么您需要查找由一个或多个非数字与该特定数字交替出现的序列组成的行,即基本上([^0-9]+1234)*。该行可以以数字或非数字开始和结束,而非数字的内部序列不能为空。此外,该行必须至少包含该数字一次。把它们放在一起:

grep -xE '[^0-9]*1234([^0-9]+1234)*[^0-9]*' file.txt

相关内容