了解一个sed示例

Tim*_*imm 4 bash sed

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

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

谢谢你的帮助!

anu*_*ava 5

这是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(所以剩下的就是密码)