繁体   English   中英

理解 sed 示例

[英]Understanding a sed example

我找到了从 Mac OS X 钥匙串项目中提取密码的解决方案。 它使用sedsecurity命令中获取密码:

security 2>&1 >/dev/null find-generic-password -ga $USER | \ 
  sed -En '/^password: / s,^password: "(.*)"$,\1,p'

该代码是 在这里通过“sr105”的注释。 |之前的部分计算为password: "secret" 我试图弄清楚sed命令的工作原理。 以下是一些想法:

我理解标志-En ,但是这个例子中的逗号是做什么的? 在 sed 文档中,它说逗号分隔地址范围,但有 3 个逗号。

第一个“地址” /^password: /有一个尾随s ; 在文档中s仅被提及为替换命令,如s/pattern/replacement/ 不是这里的情况。

^password: "(.*)"$部分看起来像用于隔离secret则表达式,但它没有分隔。

我可以理解打印出反向引用\\1的结尾部分,但同样,逗号在那里做什么?

请注意,我对这个 sed 示例的更简单替代方案不感兴趣。 这只是一个更大的 bash 脚本的一部分,它将在 .htaccess 文件中包含更多的 sed 解析,所以我真的很想学习语法,即使它模糊。

谢谢你的帮助!

这是 sed 命令:

sed -En '/^password: / s,^password: "(.*)"$,\1,p'
  • 逗号用作正则表达式分隔符,它很可能是另一个分隔符,如#

     sed -En '/^password: / s#^password: "(.*)"$#\\1#p'`
  • /^password: /查找以password:开头的输入行password:

  • s#^password: "(.*)"$#\\1#ppassword:之后查找并捕获双引号字符串,并用捕获的字符串\\1替换整行(因此剩下的就是密码)

首先,该命令从文件(或流)中提取密码并将它们打印到标准输出。

虽然您“通常”可能会在文件的所有行上执行sed命令,但sed提供了指定一个正则表达式模式,该模式描述了以下命令应该应用于哪些行。

在你的情况下

/^password: /

是一个正则表达式,表示命令:

s,^password: "(.*)"$,\1,p

应该对所有看起来像password: "secret"行执行。 该命令将这些行替换为密码本身,同时隐藏外部行。

替代命令可能看起来不常见,但您可以在sed命令中选择分隔符,它不仅限于/ 在这种情况下,被选中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM