簡體   English   中英

理解 sed 示例

[英]Understanding a sed example

我找到了從 Mac OS X 鑰匙串項目中提取密碼的解決方案。 它使用sedsecurity命令中獲取密碼:

security 2>&1 >/dev/null find-generic-password -ga $USER | \ 
  sed -En '/^password: / s,^password: "(.*)"$,\1,p'

該代碼是 在這里通過“sr105”的注釋。 |之前的部分計算為password: "secret" 我試圖弄清楚sed命令的工作原理。 以下是一些想法:

我理解標志-En ,但是這個例子中的逗號是做什么的? 在 sed 文檔中,它說逗號分隔地址范圍,但有 3 個逗號。

第一個“地址” /^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:開頭的輸入行password:

  • s#^password: "(.*)"$#\\1#ppassword:之后查找並捕獲雙引號字符串,並用捕獲的字符串\\1替換整行(因此剩下的就是密碼)

首先,該命令從文件(或流)中提取密碼並將它們打印到標准輸出。

雖然您“通常”可能會在文件的所有行上執行sed命令,但sed提供了指定一個正則表達式模式,該模式描述了以下命令應該應用於哪些行。

在你的情況下

/^password: /

是一個正則表達式,表示命令:

s,^password: "(.*)"$,\1,p

應該對所有看起來像password: "secret"行執行。 該命令將這些行替換為密碼本身,同時隱藏外部行。

替代命令可能看起來不常見,但您可以在sed命令中選擇分隔符,它不僅限於/ 在這種情況下,被選中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM