sedが置換エントリにゼロを追加するのはなぜですか?

sedが置換エントリにゼロを追加するのはなぜですか?

この変数を「5.6.10」の値に置き換えたいと思います。

VERSION=5.4.38

現在の値を知ると、何をすべきかがわかります(5.4.38)

sed s:VERSION=5.4.38:VERSION=5.6.10:g

しかし、値がわからなくても(多くのファイルやスクリプトに役立つ)、5.6.10の内容に置き換えたいと思います。私はこれを試しました

sed s:VERSION=[0-9].[0-9].[0-90-9]:VERSION=5.6.10:g

しかし、結果は変です。

VERSION=5.6.100

10が100になった理由は何ですか?

私も試しました

sed s:VERSION=[0-9].[0-9].[0-9]:VERSION=5.6.10:g

私は同じ結果を見る。

答え1

[0-90-9]任意の数字である可能性がある文字と一致します。あなたが意味するのは、[0-9][0-9]2つの数字が正確に一致することです。どちらの試みでも、の最後の数字は5.6.100正規表現と一致しないため、出力には変更されていません。

別の潜在的な問題は正規表現.の特殊文字です。これはすべての文字と一致します。たとえば、[0-9].[0-9].[0-9][0-9]match123.45または1a2b34.は点を一致させるために使用されます\.。特殊文字の前にバックスラッシュがある場合は、特殊文字ではありません。

また、バージョン番号の桁数は多いか少なくてもかまいません。[0-9.]*必要な数のポイントまたは数字を一致させるために使用されます。 (.括弧内にある場合は特殊文字ではありません。)より正確には、[0-9.]*点と数字の可能な最長の順序と一致するため、すべて一致します。[0-9][0-9.]*最初に1つ以上の数字を強制するには、このオプションを使用します。

sed 's:VERSION=[0-9][0-9.]*:VERSION=5.6.10:g'

答え2

sedシェルがファイル名のグロービングパターンに拡張しないように式を正しく引用したと仮定すると、コマンドは次のようになります。

sed 's:VERSION=[0-9].[0-9].[0-90-9]:VERSION=5.6.10:g'

文字列をVERSION=5.4.38VERSION=5.6.108ではなくVERSION=5.6.100)に変換します。[0-90-9]一致するのでこうなります。一つ特徴。したがって、VERSION=5.4.3に置き換えられ、VERSION=5.6.10後続は維持されます8

代替の別の奇妙な点は、点をsedエスケープせずに(単一文字と一致する)/g最後に点を使用することです。私が知っている限り、複数の文字列を単一の行に一致させたくない場合でも、ドットを使用することです。

任意の数値文字列が同じである可能性があるフォームのパターンをVERSION=xx.yy.zz置き換えるには、次のようにします。xx

sed 's/\(VERSION=\)[[:digit:]]\{1,\}\.[[:digit:]]\{1,\}\.[[:digit:]]\{1,\}/\15.6.10/'

[0-9]または代わりに使用するには、次の手順を実行します[[:digit:]]

sed 's/\(VERSION=\)[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}/\15.6.10/'

または基本正規表現の代わりに拡張機能を使用したい場合は、

sed -E 's/(VERSION=)[0-9]+\.[0-9]+\.[0-9]+/\15.6.10/'

またはさらに圧縮したい場合は、

sed -E 's/(VERSION=)([0-9]+\.){2}[0-9]+/\15.6.10/'

または実際には、

sed 's/\(VERSION=\).*/\15.6.10/'

VERSION=...文字列のすべての内容を削除するだけです。

答え3

解決策を見つけてポイントを追加してください。これは5.5.10、6.4.20、3.2.20などで動作します。

sed s:VERSION=[0-9].[0-9].[0-9].:VERSION=5.6.10:g 

しかし、1.2.3 4.5.1 3.2.9ではそうではありません。このペアでは、この行はうまく機能します。

sed s:VERSION=[0-9].[0-9].*.:VERSION=5.6.10:g 

関連情報