我使用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"
这假定您要替换的行不包含任何'
。按照你的情况,我想这应该不成问题。