首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed替换大约64个基于编码的字符串(调用外部回波+ base64)

使用sed替换大约64个基于编码的字符串(调用外部回波+ base64)
EN

Stack Overflow用户
提问于 2021-08-19 15:23:28
回答 2查看 404关注 0票数 0

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

代码语言:javascript
复制
company: Medidata
company: Milestone
company:: QWRQIFNlcnZpw6dvcw==
company: ROFF

手动地,我可以用以下方式解码那些编码的字符串:

代码语言:javascript
复制
echo QWRQIFNlcnZpw6dvcw== | base64 -d

但我无法使用sed转换所有字符串(只替换编码的字符串)。

这是可行的,但确实可以替代。它仅用于调试。

代码语言:javascript
复制
cat output.txt | sed "s/:: \(.\+\)/: `echo \\\1`/"
company: Medidata
company: Milestone
company: QWRQIFNlcnZpw6dvcw==
company: ROFF

我想做的是:

代码语言:javascript
复制
cat output.txt | sed "s/:: \(.\+\)/: `echo \\\1 | base64 -d`/"
base64: invalid input
company: Medidata
company: Milestone
company: 
company: ROFF

base64抱怨输入,但在我看来很不错。

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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可以:

代码语言:javascript
复制
sed -E "s/(.*:): (.+)/printf %s '\1 '; echo '\2' | base64 -d/e"

这假设要替换的行不包含任何'。在你的情况下,我认为这不应该是个问题。

票数 3
EN

Stack Overflow用户

发布于 2021-08-19 15:52:20

使用GNU,您可以使用s///e

代码语言:javascript
复制
$ 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扩展。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68850553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档