私は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"
をそして、私は交換したいですベーステキストはプレーンテキストで
someline
someline
Base64Expression stringValue="foo"
someline
Base64Expression stringValue="bar"
将来的には
私はawkの使用を開始しましたが、私はそれがSEDと単純(とはるかにエレガント)得ることができるものの、後方操作(復号されたファイルにBASE64で文字列をコードする)
を行う必要があるでしょう。
#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内でシェル変数を使用する場合は一重引用符を二重引用符に置き換える必要があります。 – sjsam
awk'そのような処理のために設計されている。しかし、私たちはあなたの問題を、あなたの助けとなるように入力を与えられたあなたの必要な出力として再現するために、サンプルデータの最小セットを見る必要があります。その情報を含めるようにQを編集してください。がんばろう。 – shellter
@shellter私はawkでやったことを使って自分の質問を編集しました。 @ sjsam、引用符を指摘してくれてありがとう、私もそれを編集しました。 – statox