ファイルのバージョン番号を更新する必要があります。ファイルには、次のようにセマンティックバージョン番号を含む行があります。
foo.bar.blah.blub#10.6.1
それでは、「blah.blub」プレフィックスを見つけて正しい行を識別し、バージョン番号を変更したいと思います。
私が得た以下は明らかに動作しません。
sed -i -e 's/^blah.blub#\d\.\d\.\d$/blah.blub'${VERSION}/$ README.MD
答え1
Sedはデフォルトでデフォルトの正規表現を使用しますが、ほとんどの実装(使用中のように見えるGNU実装を含む)はそれを理解していません\d
。また、あなたの行はで始まらないので一致しないという意味ですblah.blub
。^
そして他の様々な問題。
これにより、必要な操作が実行されます。
sed -i -E "/blah\.blub#/s/#.*/#$VERSION/" README.MD
これにより、aの後のテキストが#
の内容に置き換えられます$VERSION
。ただし、その行にが含まれている場合にのみ適用されますblah.blub
。これで1行しか表示されていないので、これがあなたのデータに十分具体的かどうかわかりません。
答え2
-i
そして特徴\d
ですperl
。一部のsed
実装では、これらの機能の1つまたは両方(ast-openなど)が追加されていますが、いずれにしても、両方の機能はコマンドの標準仕様に含まれず、移植sed
可能ではありません。
ここでは実際を使用することもできます。
export VERSION
perl -pi -e 's/^([\w.]*\.)?blah\.blub#\K\d+\.\d+\.\d+$/$ENV{VERSION}/' README.MD
これには0個以上のオプションのシーケンスが許可されています。言葉文字またはドット、前のドットで終わり、blah.bluh
元のバージョン番号の3つのコンポーネントのそれぞれに2つ以上の数字が許可されます。
また、コード式ではなく環境変数を介して新しいバージョン文字列を渡すので、より安全で(任意のコード挿入の脆弱性を防止します)、より安定しています(新しいバージョンのテキストにすべての文字またはバイト値を許可する)。