2017-02-08 5 views
1

4桁の郵便番号に先行ゼロを追加しようとしています - これはトレーニングの一部であるため、sedコマンドを使用する必要があります。私の下のコードは失敗し続けるようですが、私はそれに間違ったものは見つけられません。sed:郵便番号に先行ゼロを追加

私はUnix/Bashやsedに詳しくはないので、説明があれば助けてください。

sed -r 's/\<[0-9]{4}\>/0&/' 

これはテストスクリプトは私の結果がOKであることを確認するために実行されたときに私が取得エラーです:

Expected: 
[['12963' '40'] 
['09993' '12'] 
['99993' '1'] 
['01003' '1234']] 
Received: 
[['12963' '40'] 
['9993' '12'] 
['99993' '1'] 
['1003' '1234']] 
+0

どのように障害が発生しているかを具体的に説明できますか? (もしエラーが出たら、そのエラーの*正確なテキストは何ですか?それだけでそこに座っていますか?もしそうなら、あなたはそれをどのように入力していますか?) –

+1

また、一緒にテストする? http://stackoverflow.com/help/mcveを参照してください –

+1

また、 'sed'ベースの答えが受け入れられるので、これは間違いなく' sed'が組み込まれていないので*バッシュと一緒に配布されたり、そうでなければbashの一部になります。 –

答えて

1

あなたは、このようなechoかなどのコマンドからの標準入力出力をパイプしている場合、それが動作するはずですcat

echo '4121' | sed -r 's/[0-9]{4}/0&/' # Output: 04121 
echo 'h3llo41world' | sed -r 's/[0-9]{4}/0&/' # Output: h3llo41world 
echo 'h3llo4121world' | sed -r 's/[0-9]{4}/0&/' # Output: h3llo04121world 
echo '1341' | sed -r 's/\<[0-9]{4}\>/0&/' # Output: 01341 
echo 'a1341' | sed -r 's/\<[0-9]{4}\>/0&/' # Output: a1341 

-rは拡張正規表現を意味します。

[0-9]{4}はあなたの文字列で4桁の数字を見つけている

0&がゼロを追加し、左側で見つかったものは何でも試合にアンパサンド&を置き換えることを意味します。

\<および\>は単語境界条件です。したがって、上記の例4では正規表現は一致しますが、例5では正規表現は一致しません。

1

\<\>の代わりに、と\)を使用して、一致する部分をキャプチャすることを考えたと思います。一致する部品が1つしかないので、&で十分です。

それはあなたのsedがより弾力にする方が良いです - 郵便番号は、すでに5桁の数字を持っているとき、それは不正な動作ではないはずです。

echo 95014 | sed -E 's/^[0-9]{4}$/0&/' => 95014 
echo 5014 | sed -E 's/^[0-9]{4}$/0&/' => 05014 

我々が持っているとして上記sed式は、唯一の4桁の数字を持っている文字列を検索します^(文字列の先頭)と$(文字列の最後)のアンカーを使用しました。


上記sedコマンドの制限は、それはあなたの文字列が4桁の数字を持っている場合にのみ、0パディングを行うだろうということです。 3桁、2桁、1桁の郵便番号の大文字小文字を処理するために、式を追加する必要があります。

+0

不思議なことに、これはうまくいかないようです。 '-E'は何をすべきか? – vashts85

+0

'-E'は拡張正規表現を表します。取得しているエラーを貼り付けてください。それは私のためにUbuntu 14.04で動作します。 – codeforester

+2

'-E'はGNUでもサポートされているBSD拡張です(EREを有効にするGNUのネイティブフラグは' -r'です)が、POSIXではないので、空き領域は広いものの、無制限ではありません。 –