昔から始めるのが一番だと思います。
> echo "[20-20:10]Something" | sed -r -e 's/^\[[0-9\:\-]+(.*)$/\1/'
]Something
> echo "[20-20:10]Something" | sed -r -e 's/^\[[0-9\-\:]+(.*)$/\1/'
-20:10]Something
唯一の違いは、正規表現の文字クラスと文字を置き換えたことです:
。-
もしそうなら、sedの正規表現文字クラスの文字順序は重要ですか?次のような他の正規表現システムでは、私にとって重要ではないようです。https://regex101.com/。
Googleはこの動作に関する情報を見つけることができませんが、私のスクリプトの機能を確実に知りたいので、もっと詳しく知りたいです。
答え1
いくつかのルールがあります。この場合の重要なことは、これがスコープジョブなので、クラスの内部ではなく話すことができる-
ということです。 aをリテラル文字として含めるには、クラスの最後の文字であるのが最も簡単ですが、範囲の最初の文字または最後の文字である可能性があります。a-f
abcdef
-
文字セットを否定するには、最初の文字が必要です^
。テキストとして含めるには、最初のテキストではないはずです。
クラスが終わると、最初の(または]
最初の文字がクラスを無効にする場合は2番目)、4文字のグループになる可能性がある特別な場合があります。^
[]abc]
a
b
c
]
答え2
[0-9\:\-]
はい、数字、バックスラッシュ、コロン、またはダッシュ内の単一文字は一致しますが、[0-9\-\:]
ダッシュは一致しないため、これは重要です。 2番目の式では、ダッシュはバックスラッシュ文字とバックスラッシュ文字の間の範囲を表します(バックスラッシュは文字クラスのリテラルです)、式はと同じ[0-9\:]
です[\0-9:]
。
本当にダッシュいいえ^
文字クラスの最初(おそらく後で)または最後の場合は文字シーケンスを表します。
また、sed
リンク先のサイトが明示的にサポートしていないPOSIX正規表現を処理していることに注意してください。私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?)。