我正在尝试为文件中的地址字段建立验证
文件是这样的;
123 Strata Ln.
15 138th Ave
27 Hilltop Dr. Apt. 7
F52 Milk Ln.
156A Fantastic St.
56 sample Ln.
这些是条件:
数字 - 至少一位数字,后跟任意数量的附加数字
街道名称 - 任意数量的单词(至少一个),每个单词以大写字母或数字开头,后跟任意数量的小写和大写字母、数字或句点 (.)
编辑:在这些条件下,只有文件的前三行有效
这是我尝试过的
'^[[:digit:]][[:digit:]]+ ([[:upper:]]|[[:digit:]])([[:alphabet:]]|[[:digit:]])+\.$'
但它似乎不起作用。有什么帮助吗?
答案1
至少一位数字,后跟任意数量的附加数字
+
已经是“一个或多个”,所以[[:digit:]][[:digit:]]+
至少需要两个。所以[[:digit:]]+
。
单词(至少一个),每个单词以大写字母或数字开头,后跟任意数量的小写和大写字母、数字或句点 (.)
大写或数字:[[:upper:][:digit:]]
,这里不需要交替 ( |
),因为我们可以同时使用括号内的两个字符类。
[[:alphabet:]]
不是有效的字符类,但有alpha
and alnum
(用于字母或数字)。后者可能有用。
一句话:[[:upper:][:digit:]][[:alnum:].]*
多个单词,每个单词前面有空格(也可以处理前导数字后面的空格):([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+
由于您想要匹配整行,请将^
和添加$
到末尾,或使用grep -x
.您可能需要添加[[:blank:]]*
到末尾(之前$
)以允许尾随空白,这些空白很容易意外留下。
这只会打印示例输入的前三行:
grep -E '^[[:digit:]]+([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+$' file
有一个在线工具可以使用正则表达式https://regex101.com/
您可能会发现这对测试很有用。请注意,上面的要求是grep -E
因为+
(替代方案很难看),但我不认为 regex101 允许使用简单的基本grep
正则表达式。