我试图在文件中查找包含一个或多个 实例的行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 作为有效,我该如何防止?
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)
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]*)?$
:可以有非数字字符结尾,只要它们前面有一个空格即可。