将sed反向引用传递给base64命令

时间:2014-03-20 20:12:17

标签: bash unix sed base64 backreference

我想要实现的是将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

我认为输出解释了我的意思。

有可能做我想做的事吗?如果没有,为什么?

2 个答案:

答案 0 :(得分:3)

Perl s///可以做你想做的事,但我不认为你所要求的是你所需要的。

$ echo SGVsbG8gQmFzZTY0Cg== | perl -MMIME::Base64 -pe 's/(.+)/decode_base64($1)/e'
Hello Base64

实际发生了什么:

echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour \\1)/"
  • 在sed开始读取输入之前,shell会在双引号字符串
  • 中注意到进程替换
  • 使用字符串decodeBaseSixtyFour
  • 调用"\\1"函数
  • 输入\1上的base64 chokes并发出错误消息
  • 该函数返回字符串"\1 is decoded to "
  • 现在sed脚本是'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