![「[az] *」がアルファベットではなく文字列と一致するのはなぜですか?](https://linux33.com/image/133778/%E3%80%8C%5Baz%5D%20*%E3%80%8D%E3%81%8C%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%99%E3%83%83%E3%83%88%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F.png)
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/'
ましたが、それがうまくいく理由と私がうまくいかない理由を理解できません。
助けてください?
答え1
パターン[a-z]*
マッチング若いa
または範囲内の複数の文字z
(実際文字は現在のロケールによって異なります)。文字列の先頭にはこれらの文字がゼロ個123 abc
(たとえばパターン一致)の先頭にはこれらの文字が4つありますthis is a line
。
少なくとも必要な場合一つ一致させてから、またはを使用するか、および[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)
答え2
*
一致するから0以上前の原子が繰り返され、すべての正規表現エンジンは最初の一致を見つけようとします。文字列の先頭には正確にゼロの文字がある部分文字列があるため、これは一致します。文字列が文字で始まる場合、*
できるだけ多くの一致が一致しますが、これは一番左の一致を見つけるのに副次的です。
長さ0の一致は少し問題がある可能性がありますが、解決策は少なくとも1つの文字が必要になるようにパターンを変更することです。拡張正規表現を使用すると、次のことができます+
。sed -E 's/[a-z]+/SUB/'
楽しみで次を試してみてください。
echo 'less than 123 words' | sed 's/[0-9]*/x/g'