'[az] *'がアルファベット以外の文字列と一致するのはなぜですか?


9

alphanum次の2行を含むファイルがあります。

123 abc
this is a line

を実行するsed 's/[a-z]*/SUB/' alphanumと、次の出力が表示される理由がわかりません。

SUB123 abc
SUB is a line

私は期待していました:

123 SUB
SUB is a line

私は修正を見つけました(sed 's/[a-z][a-z]*/SUB/'代わりに使用してください)が、なぜそれが機能し、私のものが機能しないのか理解できません。

手伝ってくれますか?



@Kamaraj、これは似ていますが、上部にシェルパターンと正規表現の混乱があります(答えは前者に集中してls foo*います。とにかく、重複している質問を見つけた場合は、そのようにフラグを立てることもできると思います。
ilkkachu

regexr.comでライブ映像と説明をチェック
RozzA

@RozzAリンク先のWebサイトは、POSIX正規表現ではなく、JavascriptおよびPerl正規表現をサポートすることに注意してください。
クサラナンダ

回答:


28

パターンは、範囲から0個以上の文字に[a-z]*一致します実際の文字は現在のロケールに依存します)。文字列の最初(つまり、パターンマッチ)にはそのような文字はありません。また、の最初には4文字あります。az123 abcthis is a line

少なくとも1つの一致が必要な場合は、またはを使用する[a-z][a-z]*[a-z]\{1,\}sed -Eおよびを使用して拡張正規表現を有効にします[a-z]+

パターンが一致する場所を視覚化するには、各一致の前後に括弧を追加します。

$ sed 's/[a-z]*/(&)/' file
()123 abc
(this) is a line

または、行のすべての一致を表示するには:

$ sed 's/[a-z]*/(&)/g' file
()1()2()3() (abc)
(this) (is) (a) (line)

最後の結果を

$ sed -E 's/[a-z]+/(&)/g' file
123 (abc)
(this) (is) (a) (line)

7
複数の文字で構成できる照合要素に技術的に[a-z]一致します。例えば、いくつかのハンガリー語のロケールでは、上の試合[a-z]dzs
ステファンChazelas

12

前のアトムのゼロ回以上の繰り返しに*一致するため、すべての正規表現エンジンが最初の一致を見つけようとします。文字列の先頭にちょうどゼロ文字の部分文字列があるので、それが一致します。文字列が文字で始まる場合は、可能な限り多く一致しますが、これは左端の一致を見つけることに次ぐものです。*

長さがゼロの一致は少し問題になる可能性があります。ご覧のように、解決策は、パターンを変更して少なくとも1つの文字が必要になるようにすることです。拡張正規表現を使用すると、次のことができます+sed -E 's/[a-z]+/SUB/'

楽しみにしてみてください:

echo 'less than 123 words' | sed 's/[0-9]*/x/g'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.