Shell

如何使用 SED 將正則表達式擷取的版本號替換為另一個版本號?

  • December 22, 2021

我正在嘗試使用以下 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.

引用自:https://unix.stackexchange.com/questions/683477