我找到了从 Mac OS X 钥匙串(keychain)项目中提取密码的解决方案。它使用 sed
从 security
命令获取密码:
security 2>&1 >/dev/null find-generic-password -ga $USER | \
sed -En '/^password: / s,^password: "(.*)"$,\1,p'
密码是here在'sr105'的评论中。 |
之前的部分计算为 password: "secret"
。我试图弄清楚 sed
命令的确切工作原理。以下是一些想法:
我理解标志 -En
,但是逗号在这个例子中有什么作用?在 sed 文档中它说逗号分隔地址范围,但有 3 个逗号。
第一个'address' /^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:
开头的输入行
s#^password: "(.*)"$#\1#p
查找并捕获password:
之后的双引号字符串,并将整行替换为捕获的字符串\1
(所以剩下的就是密码)
关于regex - 了解 sed 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21465965/