首页 > 解决方案 > 比赛号码以 1 结尾,但以 11 结尾时除外

问题描述

我需要匹配以 1 结尾的任何数字,但以 11 结尾的数字除外。我使用 awk。为了说明,正确的工作行是:

if ( max ~ /1$/ && max !~ /11$/ ) { print max }

或使用正则表达式:

if ( max ~ /[^1]1$|^1$/ ) { print max }

或相同正则表达式的慢得多的变体:

([^1]|^)1$

我实际上怀疑这一部分(经过修改)应该以某种方式工作。它很好,简短易读,比上述组合的步骤少得多,适用于所有多于 2 位的数字,但对于 1 本身则失败。我在上面修复了,但更喜欢更好的(如果有的话)。我实际上需要它来处理 1 到 3 位数字,但不希望限制它。

[^1]1$

一旦我尝试使用量词来修复它,它就无法正常工作。它要么开始选择前导 1(例如 1211 匹配但它不应该匹配),要么丢失单个数字 1 作为匹配。显然,我的问题在于我必须匹配数字的结尾。如何制作更好的正则表达式?

测试用例:匹配数字为:
1
21
31
121
131
1021

跳过(不匹配)以 11 结尾的数字,例如:
11
111
211
1011
1211

标签: regexawk

解决方案


如果您的 Input_file 与所示示例相同,那么以下内容awk可能会对您有所帮助。

awk  '/[02-9]1$/||/^1$/' Input_file

假设以下是示例 Input_file。

cat Input_file
1
2001
21
31
121
131
1021
11
111
211
1011
1211

然后运行代码后将输出以下内容。

awk  '/[02-9]1$/||/^1$/'  Input_file
1
2001
21
31
121
131
1021

推荐阅读