我找到了从Mac OS X Keychain项目中提取密码的解决方案。它使用sed
从security
命令获取密码:
security 2>&1 >/dev/null find-generic-password -ga $USER | \
sed -En '/^password: / s,^password: "(.*)"$,\1,p'
“sr105”评论中的代码为here。 |
之前的部分评估为password: "secret"
。我正试图弄清sed
命令的确切作用。以下是一些想法:
我理解标记-En
,但是这个例子中的逗号是什么?在sed文档中,它用逗号分隔地址范围,但有3个逗号。
第一个“地址”/^password: /
的结尾为s
;在文档中s
仅作为替换命令提及,如s/pattern/replacement/
。不是这里的情况。
^password: "(.*)"$
部分看起来像是用于隔离secret
的正则表达式,但它没有分隔。
我可以理解打印后引用\1
的结尾部分,但是再一次,那里的逗号是什么?
请注意,我对这个sed示例的更简单的替代方法不感兴趣。这只是一个更大的bash脚本的一部分,它将在.htaccess文件中包含一些更多的sed解析,所以我真的想学习语法,即使它 模糊不清。
感谢您的帮助!
答案 0 :(得分:5)
这是sed命令:
sed -En '/^password: / s,^password: "(.*)"$,\1,p'
逗号用作正则表达式分隔符,它很可能是#
之类的另一个分隔符:
sed -En '/^password: / s#^password: "(.*)"$#\1#p'`
/^password: /
找到以password:
s#^password: "(.*)"$#\1#p
在password:
之后找到并捕获双引号字符串,并用捕获的字符串\1
替换整行(所以剩下的就是密码)答案 1 :(得分:0)
首先,该命令从文件(或流)中提取密码并将其打印到stdout。
虽然“通常”可能会对文件的所有行执行sed
命令,但sed
提供了指定正则表达式模式的方法,该模式描述了应该应用以下命令的行。
在你的情况下
/^password: /
是一个正则表达式,说命令:
s,^password: "(.*)"$,\1,p
应该对所有看起来像password: "secret"
的行执行。该命令用密码本身替换这些行,同时抑制外部行。
substitute命令可能看起来不常见,但您可以在sed
命令中选择分隔符,但不限于/
。在这种情况下,,
被选中。