セドとキャプチャグループとの戦い

セドとキャプチャグループとの戦い

以下のテキストファイルがあります。

(111)1111111
(111)-111-1111
(111)111-1111
111.111.1111

正規表現とsedを使用してグループキャプチャを練習するために使用します。ファイルに対して実行するコマンド(testと呼ばれる)は次のとおりです。

sed 's/(?\(\d(3}\)[-.]?\(\d{3}\)[-.]?\(\d{4}\)/\1\2\3' test > output

予想される出力は各行のすべて1です。しかし、私が得るのは、変更がないファイル全体です。何が間違っていますか?

ベストアンサー1

標準の基本正規表現では、(?\(\d(3}\)[-.]?これは次のことを意味します。

a literal left parenthesis
a literal question mark
(start of a group)
a literal character 'd'
a literal left parenthesis 
the number '3'
a literal closing brace
(end of group)
a dash or a dot
a question mark

つまり、次のように印刷されますx

echo '(?d(3}-?' |sed 's/(?\(\d(3}\)[-.]?/x/'

sed -EERE(拡張正規表現)を有効にしてから、グループ化とリテラルの括弧で囲むためにおよびを(使用する可能性が高いです。)\(\)

また、これは\d標準正規表現ではなくPerl正規表現の一部であり、GNU sedはいくつかのエスケープをサポートしていますが、標準ではありません(私の考えではありません)。同様に、GNU sedはEREの意味を表現するためにBREでこれをサポートしていますが、これは標準ではありません。\X\d\??

これらすべてを念頭に置いてください。

$ echo '(123)-456-7890' | sed -E 's/\(?([0-9]{3})\)?[-.]?([0-9]{3})[-.]?([0-9]{4})/\1\2\3/'
1234567890

無差別代入で、数値を除くすべての項目を削除することもできます。

$ echo '(123)-456-7890' | sed -e 's/[^0-9]//g'
1234567890

(もちろん、次のような(123)-4.5-6-7a8b9c0ことも許可されています...)

また見なさい:

おすすめ記事