Regex sed中的邮政编码过滤器
假设邮政编码的格式为A0A 0AA,或者A0 0AA,其中a是任意字母,0是任意数字,我编写了以下sed脚本来搜索网页上的邮政编码Regex sed中的邮政编码过滤器,regex,linux,unix,sed,postal-code,Regex,Linux,Unix,Sed,Postal Code,假设邮政编码的格式为A0A 0AA,或者A0 0AA,其中a是任意字母,0是任意数字,我编写了以下sed脚本来搜索网页上的邮政编码 s/\(([[:alnum:]]\{2,4\})\) \(([[:alnum:]]\{3\})\)/\1 \2/p 将第一个零件(A0A)存储在第一个区域中,将第二个零件(0AA)存储在第二个区域中。然后打印出发现的内容。但是,运行此操作当前找不到任何邮政编码 有什么想法吗?谢谢很难找到适合你的正则表达式的东西 里面的括号是什么意思?因为它们是不可替代的,所以它们
s/\(([[:alnum:]]\{2,4\})\) \(([[:alnum:]]\{3\})\)/\1 \2/p
将第一个零件(A0A)存储在第一个区域中,将第二个零件(0AA)存储在第二个区域中。然后打印出发现的内容。但是,运行此操作当前找不到任何邮政编码
有什么想法吗?谢谢很难找到适合你的正则表达式的东西
我没有给出一个具体的例子来说明如何做到这一点,因为你要求“任何想法”。我假设您希望在给定正确指针的情况下尝试自己修复此问题。看起来您的括号有一些问题。以下是我的作品:
$ sed -n 's/.*\b\([[:alnum:]]\{2,3\}\) \([[:alnum:]]\{3\}\)\b.*/\1 \2/p' <<< "here is a postcode: A0A 0AA. some more text"
A0A 0AA
$sed-n's/*\b\([[:alnum:]\{2,3\}\([[:alnum:]\{3\}\)\b.*/\1\2/p'我知道你在询问有效邮政编码的子集,但我希望这个针对英国邮政编码的解决方案会有所帮助。我会这样处理这个问题:
看一下,格式是
- A9 9AA
- A99 9AA
- AA9 9AA
- AA99 9AA
- A9A 9AA
- AA9A 9A
最后一部分的正则表达式很简单:[0-9][A-Z]{2}
第一部分是骗子。我将问题分为两部分:
- 可以使用
[A-Z]{1,2}[0-9]{1,2}
匹配上述前四种模式,即一个或两个字母后跟一个或两个数字李>
- 最后两个模式可以使用
[A-Z]{1,2}[0-9][A-Z]
进行匹配,即一个或两个字母,然后是一个数字和一个字母
总而言之:
sed -rn 's/.*(([A-Z]{1,2}[0-9]{1,2}|[A-Z]{1,2}[0-9][A-Z]) [0-9][A-Z]{2}).*/\1/p'
作为一般提示,我建议您开始构建更复杂的正则表达式,方法是构建和测试各个部分,验证它们是否工作,然后将整个过程组合在一起。在这种情况下,这意味着尝试匹配A0或A0A,然后匹配0AA,然后将它们放在一起。奇怪的问题。您的个人资料显示为UK,但您提供的格式不能充分描述英国邮政编码。您还修复了我强调的{2,4}问题。你应该在你的回答中指出这一点,否则OP可能不会注意到,仍然会被卡住。你还没有解决正则表达式会产生许多错误匹配的问题,但这不是我们被要求解决的问题,所以这是公平的。很高兴你意识到这一点,我想尽可能地为自己解决,这是我找到的最好的学习方法。在这些指针之后,我得到了s/(.*)([[:alpha:]\{1,2\})([:digit:]\{1,2\}[:alpha:]\{,1\})[:space:]]([:digit:]])([:alpha:]\{2\})(.]/\2\3\4\5谢谢。