次の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個の英数字(使用中の正規表現で実行する作業)が続き、バージョンを使用して追加するだけです-E
(sed
実装がサポートしていると仮定)。
$ 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