2012-11-08 72 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'