regex - 了解 sed 示例

标签 regex bash sed

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

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/

相关文章:

macos - 如何列出 OS X 中正在运行的程序的所有窗口标题?

mysql - 如果行很长,sed 无法进行替换

linux - 如何使用sed修改文件内容

regex - 替换复杂模式中的字符

mysql - 使用正则表达式匹配mysql中模式的子串

javascript - 使用 JavaScript 移除类

linux - 从日志文件中搜索值和计数

regex - 使用正则表达式和 scala 匹配域名

regex - 匹配两个或多个不相同的字符

bash 使用陷阱 SIGCHLD 重新启动子进程?