1

郵便番号が A0A 0AA または A0 0AA の形式で、A が任意の文字で 0 が任意の数字であると仮定すると、次の sed スクリプトを作成して、Web ページで郵便番号を検索します。

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

第1部分(A0A)を第1領域に格納し、第2部分(0AA)を第2領域に格納する。次に、見つかったものを出力します。ただし、これを実行しても現在、郵便番号が見つかりません。

何か案は?ありがとう

4

3 に答える 3

2

有効な郵便番号のサブセットについて質問されていることは承知していますが、英国の郵便番号に関するこのソリューションがお役に立てば幸いです。私は次のように問題に取り組みます:

郵便番号の形式を見ると、形式は次のとおりです。

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

最後の部分の正規表現は簡単です:[0-9][A-Z]{2}

最初の部分はトリッカーです。問題を2つに分割します。

  • 上記の最初の 4 つのパターンは[A-Z]{1,2}[0-9]{1,2}、 を使用して一致させることができます。つまり、1 つまたは 2 つの文字の後に 1 つまたは 2 つの数字が続きます。
  • 最後の 2 つのパターンは を使用して一致させることができます[A-Z]{1,2}[0-9][A-Z]。つまり、1 文字または 2 文字の後に数字と文字を入力します。

すべてを一緒に入れて:

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'
于 2012-11-08T15:14:48.723 に答える
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
于 2012-11-08T14:41:37.190 に答える
0

正規表現で正しいものを見つけるのは難しいです。

  1. そこにある、エスケープされていない内側の括弧は何のためにありますか?それらはエスケープされていないため、文字通り一致しています。いずれにせよ、それらは目的を果たしません。
  2. 実際のパターンで[:alpha:]が必要な場所と[:digit:]が必要な場所があるのに、なぜ2つの[:alnum:]ブロックを一致させようとしているのですか?
  3. なぜ{2,4}?2、3、4ではなく、2、3が必要です。実際に必要なのは、文字番号文字または文字番号のいずれかです。
  4. 単語の境界を指定しないため、正規表現を修正しても、最初のパターンは単語の末尾でA0に一致し、2番目のパターンは単語の先頭で0AAに一致します。

少なくともする必要があります

  1. 内側の括弧を削除します
  2. {2,4}{2,3}に変更します
  3. 正規表現の最初と最後に単語境界の一致を追加します

ただし、これでも要件を適切に満たすことはできません。無効なパターンに一致します。あなたが本当にする必要があるのは

  1. 内側の括弧を削除します
  2. [:alpha:] [:digit:]または[:alpha:] [:digit:] [:alpha:]のいずれかに一致するように最初のパターンを変更します(これを行うには2つの方法があります)。
  3. [:digit:] [:alpha:] [:alpha:]に一致するように2番目のパターンを変更します
  4. 正規表現の最初と最後に単語境界の一致を追加します。

あなたが「どんなアイデア」を求めたので、私はこれを行う方法の具体的な例を与えませんでした。私はあなたが正しいポインタを与えられてこれを自分で修正しようとしていると仮定しています。

于 2012-11-08T14:26:30.593 に答える