SEDを使用して正規表現でキャプチャされたバージョン番号を別のバージョン番号に置き換える方法は?

SEDを使用して正規表現でキャプチャされたバージョン番号を別のバージョン番号に置き換える方法は?

次のsedコマンドを使用しようとしています。

sed 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' test.txt

内容を置き換えるためにtest.txt

shared:core:0.0.2

私はそうすると期待しています

shared:core:1.1.1

しかし、何も起こりませんでした。 sedの仕組みについていくつかのヒントが必要なようです。

答え1

あなたは(foo)この手段を使用しています捕獲ひもfoo。ただし、デフォルトではこれはリテラルの後に別のsed文字で読み取られ、入力にまたはがないため一致しません。(foo)()

sedキャプチャ括弧を使用するには(\(foo\))またはを使用する必要があります-E。しかし、実際にキャプチャしたいターゲットについて言及したことがないので、ここではこれはまったく必要ありません。必要なものは次のとおりです。

$ sed 's/shared:core:.*/shared:core:1.1.1/' file 
shared:core:1.1.1

でも:

$ sed -E 's/(shared:core:).*/\1:1.1.1/' file 
shared:core::1.1.1

それとももっと簡単です:


$ sed -E 's/(.*):.*/\1:1.1.1/' file 
shared:core:1.1.1

入力がより複雑で、一致したい項目が1〜4個の数字を1〜5回繰り返す場合は、1〜6回繰り返します。その後には1〜6個の英数字(使用中の正規表現で実行する作業)が続き、バージョンを使用して追加するだけです-Esed実装がサポートしていると仮定)。

$ sed -E 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' file 
shared:core:1.1.1

または、次のものが利用できない場合-E

$ sed  's/shared:core:\([0-9]\{1,4\}\(\.[0-9a-z]\{1,6\}\)\{1,5\}\)/shared:core:1.1.1/' file 
shared:core:1.1.1

100%移植性がないかもしれないという心配がありますが、確かではありません。

最後に、sedこのオプションを指定しないと-i入力ファイルが変更されないことに注意してください。したがって、元のファイルを変更するにはsed -i .... file

答え2

デフォルトでは、デフォルトsedの正規表現が使用されます。-E正規表現を拡張するオプションが追加されました。したがって:

sed -E 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' test.txt

またはデフォルトの正規表現に変換します。したがって:

sed 's/shared:core:\([0-9]\{1,4\}\(\.[0-9a-z]\{1,6\}\)\{1,5\}\)/shared:core:1.1.1/' test.txt

また、ファイルの内容を変更するには、-i「現在の場所」変更を引き起こすオプションを追加する必要があります。したがって:

sed -E 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' -i test.txt

関連情報