Shell
如何使用 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 一起使用的提示
您正在使用
(foo)
which 意味著擷取字元串foo
。但是,預設情況下,sed
會將其讀取為一個文字(
,然後是foo
另一個文字,)
並且由於您的輸入中沒有任何(
or)
,因此永遠不會匹配。要
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 次重複,然後是 a 的 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
.