2014-01-30 118 views
4

我找到了一個解決方案,用於從Mac OS X鑰匙串項目中提取密碼。它使用sedsecurity命令獲取密碼:瞭解sed示例

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解析,因此我很想知道它的語法,即使它是晦澀難懂。

感謝您的幫助!

+1

逗號是隨機的分隔符,它們可能是別的。 ^,^密碼:「(。*)」$,\ 1,p == s/^密碼:「(。*)」$/\ 1/p' – Wrikken

+0

剛纔我剛纔意識到。我應該回答我自己的問題嗎? – Timm

+0

現在不是已經有2個人爲你做了這個工作,對它進行了更詳細的解釋;) – Wrikken

回答

5

這裏是sed命令:

sed -En '/^password:/s,^password: "(.*)"$,\1,p' 
  • 逗號被用作正則表達式定界符它可以很好地像#另一個分隔符:

    sed -En '/^password:/s#^password: "(.*)"$#\1#p'` 
    
  • /^password: /發現一個啓動輸入線與password:

  • s#^password: "(.*)"$#\1#p查找並password:後捕獲雙引號字符串和替換與所捕獲的字符串\1整行(因此,所有剩下的就是口令)從一個文件(或流),並打印
+0

啊,我明白了。這個人試圖避免'/',因爲它可能在密碼中。 – Timm

+1

是的,這將是原因。 sed允許任何字符(包括控制字符)作爲分隔符。 – anubhava

+1

是否有任何理由認爲逗號不在密碼中,但是正斜槓會是? – Floris

0

首先,命令提取密碼他們來標準輸出。

雖然「正常」可能會在文件的所有行上執行sed命令,sed會提供指定一個正則表達式模式,該模式描述應將下列命令應用於哪條線。

在你的情況

/^password:/

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

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

應該看起來像password: "secret"所有行得到執行。該命令將這些行替換爲密碼本身,同時抑制外部行。

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