我想使用sedbash 腳本替換檔案中的字串,但該字串存在于該檔案中的多個位置。
有什么方法可以使用 WHERE 子句替換字串,這樣我就可以只在我想要的地方替換字串?
使用行號是行不通的,因為我需要一個比允許的更靈活的腳本。這就是我想要做的。
我將所需的一段代碼存盤在一個變數中。我可以在sed命令中使用該變數嗎?例如,
sed -i "s/condition: succeeded('Fair_PreProd')/condition: succeeded('Fair_UAT')/g" $folder_path/$file_name
這是原始檔案:
-stage: Moto_Dev
dependsOn: Build
condition: and(succeeded(), eq(variables.isDevelop, true))
- stage: Unity_Dev
dependsOn: Build
condition: and(succeeded(), eq(variables.isUnityDevelop, true))
- stage: QA
dependsOn: Dev
condition: succeeded('Dev')
- stage: UAT
dependsOn: Build
condition: and(succeeded(), eq(variables.isStaging, true))
有3個地方dependsOn: Build存在。我只想替換該-stage:MotoDev部分中的那個。我怎樣才能做到這一點?
uj5u.com熱心網友回復:
有什么方法可以使用 WHERE 子句替換字串,這樣我就可以只在我想要的地方替換字串?
sed沒有 SQL 樣式的WHERE子句,但命令可以具有定義要操作的輸入行子集的“地址”。這些可以采取多種形式。正則運算式可能是最常見的,但也有行號和一些特殊形式。您還可以從簡單地址構建包含范圍。地址范圍將是解決您提出的問題的相當好的方法。
例如,
sed -i '/^\s*-\s*stage:\s*Moto_Dev/,/^\s*-/ s/dependsOn: Build/dependsOn: Test/' input
解釋:
-i命令列標志告訴“sed就地”作業,這實際上意味著它將用包含sed' 輸出的檔案替換原始檔案。這
/^\s*-\s*stage:\s*Moto_Dev/,/^\s*-/是一個范圍地址,由一個用于范圍開始 (/^\s*-\s*stage:\s*MotoDev/) 的正則運算式和一個用于范圍結束 (/^\s*-/) 的正則運算式組成。/^\s*-\s*stage:\s*Moto_Dev/與您希望進行更改的部分的開頭相匹配,在某些位置的確切空白量方面具有一定的靈活性。為簡潔起見,它用于\s表示單個空格或制表符。那是一個 GNU 擴展,但如果你不能依賴 GNU,sed那么還有其他方法可以表達相同的東西。/^\s*-/匹配下一部分的開頭,因為您已經提供了 input。如果需要更有選擇性,可以更具體。該范圍包括其端點,但這對于手頭的任務似乎不是問題。
所呈現的輸入中只有一個這樣的范圍,并且該范圍包含您要修改的行。在范圍內的每一行上執行指定的替換,
s/dependsOn: Build/dependsOn: Test/但只有一個包含要替換的匹配項。范圍內的所有其他人將不受影響。根本沒有為范圍之外的行指定命令,因此它們也不會受到影響。
你還問,
我將所需的一段代碼存盤在一個變數中。我可以在
sed命令中使用該變數嗎?例如,sed -i "s/condition: succeeded('Fair_PreProd')/condition: succeeded('Fair_UAT')/g" $folder_path/$file_name
sed不會擴展 shell 樣式的引數參考,但您不需要這樣做。該命令中的變數參考由 shell 本身在執行結果命令之前擴展,因此
- 是的,您可以使用它們,并且
- 這不是特別使用 shell 變數的問題
sed。
uj5u.com熱心網友回復:
建議awk讀取bash變數的解決方案。
filter :過濾正確行的awk 正則運算式。
target : 一個正則awk 運算式,用于標識要替換的字串
replacement: 一個字串不是正則運算式來替換目標正則運算式。
通過提供的示例:
awk '$0~filter && $0~target{gsub(target,replacement)}1' filter="block4" target="a=c" replacement="this = that" input.file
# same command, less readable, but shorter:
awk '$0~f && $0~t{gsub(t,r)}1' f="block4" t="a=c" r="this = that" input.file
這種方法的優點:
- 比 更靈活
sed。 - Generic:可以添加更多的過濾器和過濾邏輯。
這種方法的缺點:
- 無法對輸入檔案進行就地替換。喜歡
sed -i - 因此需要一一明確指定所有檔案。
樣本輸出:
awk '$0~filter && $0~target{gsub(target,replacement)}1' filter="block4" target="a=c" replacement="this = that" input.1.txt
block1{ a=c }
block2{ v=c }
block3{ w=c }
block4{ this = that }
block5{ a=c }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/453115.html
標籤:重击 sed 天蓝色的devops 开发运维 脚本
上一篇:什么是參考命令?
下一篇:從派生類成員初始化基類參考
