了解一个sed示例

时间:2014-01-30 19:39:22

标签: bash sed

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

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解析,所以我真的想学习语法,即使它 模糊不清。

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

这是sed命令:

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

    sed -En '/^password: / s#^password: "(.*)"$#\1#p'`
    
  • /^password: /找到以password:

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

答案 1 :(得分:0)

首先,该命令从文件(或流)中提取密码并将其打印到stdout。

虽然“通常”可能会对文件的所有行执行sed命令,但sed提供了指定正则表达式模式的方法,该模式描述了应该应用以下命令的行。

在你的情况下

/^password: /

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

s,^password: "(.*)"$,\1,p
应该对所有看起来像password: "secret"的行执行

。该命令用密码本身替换这些行,同时抑制外部行。

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