[英]Understanding a sed example
我找到了從 Mac OS X 鑰匙串項目中提取密碼的解決方案。 它使用sed
從security
命令中獲取密碼:
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#p
在password:
之后查找並捕獲雙引號字符串,並用捕獲的字符串\\1
替換整行(因此剩下的就是密碼)首先,該命令從文件(或流)中提取密碼並將它們打印到標准輸出。
雖然您“通常”可能會在文件的所有行上執行sed
命令,但sed
提供了指定一個正則表達式模式,該模式描述了以下命令應該應用於哪些行。
在你的情況下
/^password: /
是一個正則表達式,表示命令:
s,^password: "(.*)"$,\1,p
應該對所有看起來像password: "secret"
行執行。 該命令將這些行替換為密碼本身,同時隱藏外部行。
替代命令可能看起來不常見,但您可以在sed
命令中選擇分隔符,它不僅限於/
。 在這種情況下,
被選中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.