我正在尝试编写一个 Linux 命令,用于egrep
验证偶数字符为数字的行。
我这样做:
egrep "^(.[0-9])*$" text.txt
但是,对于 i) 空行和 ii) 字符数为奇数的情况,此方法会失败。它应该匹配,123
因为唯一的奇数位置确实是一个数字,但事实并非如此。
有效模式:
a2b4c6
000000
123
a1b
a1b2c3q
无效模式:
aaaa
0a0a0a
a1bq
谁能告诉我我犯了什么错误?
编辑:唯一的限制是每个替代字符都必须是偶数;整条线的长度可能是偶数或奇数。上面的命令只允许偶数长度,例如:1234,a1b2c3等,但即使123,a1b也是有效的,但这与它们不匹配。我的问题是:如何处理这个问题?
答案1
您的正则表达式将匹配空行,因为*
意味着“零个或多个”,因此^(.[0-9])*$
匹配空行。您可以通过使用+
(“匹配 1 或更多”) 来解决这个问题。
您的下一个问题是,如果一行中的字符数为偶数,则不匹配。为了避免这种情况,您可以告诉grep
在最后也允许 0 或 1 个字符:
grep -E "^(.[0-9])+.?$"
例如:
$ cat file
a2b4c6
000000
123
aaaa
0a0a0a
$ grep -E "^(.[0-9])+.?$" file
a2b4c6
000000
123