使用sed替换一些基于64的编码字符串(调用外部echo + base64)



我使用ldapsearch查询AD服务器。有些结果是64编码的(前面总是有::),比如:

company: Medidata
company: Milestone
company:: QWRQIFNlcnZpw6dvcw==
company: ROFF

我可以手动解码这些编码字符串:

echo QWRQIFNlcnZpw6dvcw== | base64 -d

但我不能使用sed转换所有字符串(仅替换编码字符串)。

这个可以工作,但是不能进行替换。它只用于调试。

cat output.txt | sed "s/:: (.+)/: `echo \1`/"
company: Medidata
company: Milestone
company: QWRQIFNlcnZpw6dvcw==
company: ROFF

我想做的是:

cat output.txt | sed "s/:: (.+)/: `echo \1 | base64 -d`/"
base64: invalid input
company: Medidata
company: Milestone
company: 
company: ROFF

base64抱怨输入,但对我来说它看起来很好。

我做错了什么?

使用GNU sed您可以使用s///e:

$ cat file
company: Medidata
company: Milestone
company:: QWRQIFNlcnZpw6dvcw==
company: ROFF
$ cat file | gsed -E "s/(.*):: (.*)/printf %s '\1: '; echo '\2' | base64 -d/"
company: Medidata
company: Milestone
printf %s 'company: '; echo 'QWRQIFNlcnZpw6dvcw==' | base64 -d
company: ROFF
$ cat file | gsed -E "s/(.*):: (.*)/printf %s '\1: '; echo '\2' | base64 -d/e"
company: Medidata
company: Milestone
company: AdP Serviços
company: ROFF

s///e的doc:

这个命令允许将shell命令的输入管道到模式空间。如果进行了替换,则执行在模式空间中找到的命令,并将模式空间替换为其输出。后面的换行符被抑制;如果要执行的命令包含NUL字符,则结果是未定义的。这是一个GNU sed扩展

对于sed "s/:: (.+)/: `echo \1`/"sed "s/:: (.+)/: `echo \1 | base64 -d`/",子shell`...`甚至在sed运行之前展开。因此,base64抱怨它无法解码字面值字符串1

您必须指示sed(其语法与bash不同)调用外部程序。标准sed不能调用外部程序。请参阅如何将shell命令嵌入到sed表达式中。但是GNUsed可以:

sed -E "s/(.*:): (.+)/printf %s '1 '; echo '2' | base64 -d/e"

这假定您要替换的行不包含任何'。按照你的情况,我想这应该不成问题。

最新更新