我試圖用sed做一些base64替換。Sed使用捕獲組作爲參數替換bash命令的輸出
我想要做的是這樣的:
sed -i "s|\(some\)\(pattern\)|\1 $(echo "\2" | base64 -d)|g" myFile
在英語中,這將是:
- 數學的模式
- 捕捉組
- 使用捕獲組bash命令
- 使用此命令的輸出作爲替換字符串
到目前爲止,我的命令不起作用,因爲\2
只能由SED,而不是通過bash命令我打電話知道。
有什麼優雅的解決方案,我必須將捕獲組傳遞給我想要使用輸出的命令?
編輯
這裏是我想要做的一個小例子:
我有以下文件:
someline
someline
Base64Expression stringValue="Zm9v"
someline
Base64Expression stringValue="YmFy"
而且我想,以取代通過純文本的base64:
someline
someline
Base64Expression stringValue="foo"
someline
Base64Expression stringValue="bar"
在未來,我必須做反向操作(該解碼文件中base64編碼字符串)
我用awk開始,但我雖然能得到與SED簡單(更優雅) 。到目前爲止,有AWK我有這個(其中$bundle
是我編輯的文件):
#For each line containing "Base64Expression"
#Put in the array $substitutions[]:
# The number of the line (NR)
# The encoded expression ($2)
# The decoded expression (x)
substitutions=($(awk -v bd=$bundle '
BEGIN {
# Change the separator from default
FS="""
ORS=","
OFS=","
}
/Base64Expression/ {
#Decode the base64 lines
cmd="echo -ne \""$2"\" | base64 -d"
cmd | getline x
if ((cmd | getline) == 0){
print NR, $2, x
}
}
' $bundle))
# Substitute the encoded expressions by the decoded ones
# Use the entries of the array 3 by 3
# Create a sed command which takes the lines numbers
for ((i=0; i<${#substitutions[@]}; i+=3))
do
# Do the substitution only if the string is not empty
# Allows to handle properly the empty variables
if [ ${substitutions[$((i+1))]} ]
then
sed -i -e "${substitutions[$i]}s#${substitutions[$((i+1))]}#${substitutions[$((i+2))]}#" $bundle
fi
done
這是不可能的,因爲'$(echo「\ 2」| base64 -d)'是先完成的。此外,如果在sed中使用shell變量,則需要用雙引號替換單引號。 – sjsam
'awk'是爲這樣的處理而設計的。但是,我們需要查看最小的一組樣本數據以重現您的問題以及爲了幫助您輸入所需的輸出。請編輯您的Q以包含該信息。祝你好運。 – shellter
@shellter我編輯了我用awk做過的問題。 @ sjsam,謝謝你指出我的引用,我也編輯了這個。 – statox