我想要实现的是将sed
正则表达式中捕获的Base64编码值传递给base64
并将其解码。
但问题是,即使看起来使用反向引用将正确的值传递给函数,base64
也会抱怨输入无效。
以下是我的脚本 -
#!/bin/bash
decodeBaseSixtyFour() {
echo "$1 is decoded to `echo $1 | base64 -d`"
}
echo Passing direct value ...
echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour SGVsbG8gQmFzZTY0Cg==)/"
echo Passing captured value ...
echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour \\1)/"
运行时会产生以下输出 -
Passing direct value ... SGVsbG8gQmFzZTY0Cg== is decoded to Hello Base64 Passing captured value ... base64: invalid input SGVsbG8gQmFzZTY0Cg== is decoded to
我认为输出解释了我的意思。
有可能做我想做的事吗?如果没有,为什么?
答案 0 :(得分:3)
Perl s///
可以做你想做的事,但我不认为你所要求的是你所需要的。
$ echo SGVsbG8gQmFzZTY0Cg== | perl -MMIME::Base64 -pe 's/(.+)/decode_base64($1)/e'
Hello Base64
实际发生了什么:
echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour \\1)/"
decodeBaseSixtyFour
"\\1"
函数
\1
上的base64 chokes并发出错误消息"\1 is decoded to "
's/(.+)$/\1 is decoded to /'
,这就是你获取最后一行的方式。答案 1 :(得分:1)
正如我评论的那样,sed无法做到等同于replace_callback
,而这正是你想要做的事情。
跟随awk接近你想要做的事情:
s="My string is SGVsbG8gQmFzZTY0Cg== something"
awk '{for(i=1; i<=NF; i++) if ($i~/==$/) "base64 -D<<<"$i|getline $i}1'<<<"$s"
My string is Hello Base64 something