2012-11-08 36 views
1

假设后置代码的格式为A0A 0AA或A0 0AA,其中A是任意字母,0是任意数字我已经编写了以下sed脚本以在网页中搜索邮政编码。sed中的后置代码过滤器

s/\(([[:alnum:]]\{2,4\})\) \(([[:alnum:]]\{3\})\)/\1 \2/p 

要存储在所述第一区域和所述第二区域中的第二部分(0AA)的第一部分(A0A)。然后打印出发现的内容。但是运行这个目前没有找到任何邮编。

任何想法?谢谢

+0

作为一般的提示,我建议你开始通过构建和测试各个部件构建更复杂的正则表达式,验证他们的工作,然后把整个事情一起。在这种情况下,这意味着尝试匹配** A0或A0A **,然后** 0AA **,然后将它们放在一起。 – itsbruce

+0

奇怪的问题。您的个人资料显示英国,但是您提供的格式没有充分描述英国邮政编码。 –

回答

0

很难找到你的正则表达式正确

  1. 那里有什么内在的,未转义的括号?因为它们没有转义,所以它们是完全匹配的。无论如何,它们都没有任何用处。
  2. 为什么你想匹配两个[:alnum:]当你的实际模式需要块[:阿尔法:]在一些地方和[:数字:]别人?
  3. 为什么{2,4}?你想要两三个,而不是两个,三个或四个。 实际上想要的是字母数字或字母数字。
  4. 因为你不指定字边界,即使你解决您的正则表达式,第一模式会匹配A0在单词的末尾和第二图案将在单词的开头匹配0AA

您需要,以最低的

  1. 降内括号
  2. 更改{2,4}{2,3}
  3. 添加单词边界匹配时正则表达式的开始和结束

但是,这仍然不适合y满足您的要求。它将匹配无效模式。你真正需要做的是

  1. 降内括号
  2. 更改第一图案要匹配[:阿尔法:] [:数字:][:阿尔法:] [:数字: ] [:alpha:](有两种方法可以做到这一点)。
  3. 更改所述第二图案,以匹配[:位:] [:阿尔法:] [:阿尔法:]
  4. 添加字边界在正则表达式的开始和结束相匹配。

我没有给出具体的例子,说明如何做到这一点,因为你要求“任何想法”。我假设你想在正确的指针下尝试修复这个问题。

+0

很高兴你拿起了这个事实,我想尽可能地为自己努力工作,最好的方式来学习我发现。在这些指针之后,我以 s/\(。* \)\([[:alpha:]] \ {1,2 \} \)\([[:digit:]] \ {1,2 \ } [[:阿尔法:]] \ {,1 \} \)[[:空间:]] \([[:数字:]] \)\([[:阿尔法:]] \ {2 \} \) \(。* \)/ \ 2 \ 3 \ 4 \ 5 谢谢。 – BradStevenson

0

看起来你的括号里有一些问题。对我来说,以下工作:

$ sed -n 's/.*\b\([[:alnum:]]\{2,3\}\) \([[:alnum:]]\{3\}\)\b.*/\1 \2/p' <<< "here is a postcode: A0A 0AA. some more text" 
A0A 0AA 
+0

您还修复了突出显示的{2,4}问题。你应该在答案中指出这一点,否则OP可能没有注意到,仍然被卡住。你还没有解决正则表达式会产生很多错误匹配的问题,但那不是我们被要求修复的问题,所以这很公平。 – itsbruce

2

我知道你问的有效邮政编码的一个子集,但我希望这个解决方案为英国的邮政编码会有所帮助。我想接近这样的问题:

望着format for post-codes,格式是

  • A9 9AA
  • A99 9AA
  • AA9 9AA
  • AA99 9AA
  • A9A 9AA
  • AA9A 9AA

最后一部分的正则表达式很容易:[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'