この変数を「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.38
(VERSION=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