我找到了从Mac OS X Keychain项目中提取密码的解决方案.它用于sed
从security
命令获取密码:
security 2>&1 >/dev/null find-generic-password -ga $USER | \
sed -En '/^password: / s,^password: "(.*)"$,\1,p'
Run Code Online (Sandbox Code Playgroud)
该代码是在这里通过"sr105"的注释.|
评估之前的部分password: "secret"
.我正在试图弄清楚sed
命令是如何工作的.以下是一些想法:
我理解这些标志-En
,但是这个例子中的逗号是什么?在sed文档中它用逗号分隔地址范围,但有3个逗号.
第一个'地址' /^password: /
有一个尾随s
; 在docs s
中只提到了替换命令之类的s/pattern/replacement/
.不是这里的情况.
该^password: "(.*)"$
部件看起来像正则表达式隔离secret
,但它没有分隔.
我可以理解\1
打印出反向引用的结尾部分,但同样,那里的逗号是什么?
请注意,我对这个sed示例的更简单的替代方法不感兴趣.这只是一个较大的bash脚本的一部分,它将在.htaccess文件中包含一些更多的sed解析,所以我真的很想学习语法,即使它是模糊的.
谢谢你的帮助!
这是sed命令:
sed -En '/^password: / s,^password: "(.*)"$,\1,p'
Run Code Online (Sandbox Code Playgroud)
逗号用作正则表达式分隔符,它很可能是另一个分隔符,如#
:
sed -En '/^password: / s#^password: "(.*)"$#\1#p'`
Run Code Online (Sandbox Code Playgroud)/^password: /
找到以.开头的输入行 password:
s#^password: "(.*)"$#\1#p
查找并捕获双引号字符串,password:
并用捕获的字符串替换整行\1
(所以剩下的就是密码)