[英]Understanding a sed example
我找到了从 Mac OS X 钥匙串项目中提取密码的解决方案。 它使用sed
从security
命令中获取密码:
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#p
在password:
之后查找并捕获双引号字符串,并用捕获的字符串\\1
替换整行(因此剩下的就是密码)首先,该命令从文件(或流)中提取密码并将它们打印到标准输出。
虽然您“通常”可能会在文件的所有行上执行sed
命令,但sed
提供了指定一个正则表达式模式,该模式描述了以下命令应该应用于哪些行。
在你的情况下
/^password: /
是一个正则表达式,表示命令:
s,^password: "(.*)"$,\1,p
应该对所有看起来像password: "secret"
行执行。 该命令将这些行替换为密码本身,同时隐藏外部行。
替代命令可能看起来不常见,但您可以在sed
命令中选择分隔符,它不仅限于/
。 在这种情况下,
被选中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.