我使用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: ROFFbase64抱怨输入,但在我看来很不错。
我做错了什么?
发布于 2021-08-19 15:56:21
使用sed "s/:: \(.\+\)/: `echo \\\1`/"和sed "s/:: \(.\+\)/: `echo \\\1 | base64 -d`/",子subshell `...`在sed运行之前就已经展开了。因此,base64抱怨它无法解码文字字符串\1。
您必须指示sed (它的语法不同于bash)调用外部程序。标准sed不能调用外部程序。见如何将shell命令嵌入到sed表达式中?。但是GNU sed可以:
sed -E "s/(.*:): (.+)/printf %s '\1 '; echo '\2' | base64 -d/e"这假设要替换的行不包含任何'。在你的情况下,我认为这不应该是个问题。
发布于 2021-08-19 15:52:20
使用GNU,您可以使用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文档 for s///e
该命令允许将shell命令中的输入输送到模式空间。如果进行了替换,则执行在模式空间中找到的命令,并将模式空间替换为它的输出。将抑制尾随换行符;如果要执行的命令包含NUL字符,则结果未定义。这是一个GNU扩展。
https://stackoverflow.com/questions/68850553
复制相似问题