Sed

請幫我弄清楚這個命令有什麼作用?

  • April 27, 2022

我在 stackoverflow 上執行 cron 作業時看到了一個修復問題的命令。 https://stackoverflow.com/questions/21926465/issues-running-cron-in-docker-on-different-hosts 我不確定這個命令到底是做什麼的,因為我是 unix 命令的新手。任何高貴的靈魂能說出每個部分的作用嗎?

sed --regexp-extended --in-place 's/^session\s+required\s+pam_loginuid.so$/session optional pam_loginuid.so/' /etc/pam.d/crond

sed是一個命令行文本編輯器,使用 like sed -flags command file,最常用於使用正則表達式進行查找和替換。它可以做很多事情,我發現https://www.grymoire.com/Unix/Sed.html是一個很好的初學者指南(比man頁面友好)

正則表達式 (regex) 有點像一個複雜的萬用字元系統,它可以讓您查找文本模式而不是特定事物

--regexp-extended告訴它使用擴展的正則表達式,它有更多的特性

--in-place告訴它更改文件,而不是將輸出列印到 shell 或 stdout

's/foo/bar'是 sed 的替代命令(s 代表替代),它在每一行找到第一個 ‘foo’ 並將其交換為 ‘bar’

^session:^表示正則表達式中一行的開頭

\s+:\s在正則表達式中表示“任何空格”,即空格或製表符或類似內容;+表示一個或多個,因此它匹配一個或多個空格/製表符/等。+需要擴展正則表達式

...nuid.so$:$表示正則表達式中的行尾

所以,這是找到每一行,session optional pam_loginuid.so但有更多的空格/製表符,並將其替換為session optional pam_loginuid.so一個空格,並required替換optional為文件中的 ,/etc/pam.d/crond

意思是“如果這個命令返回零,&&則執行下一個命令”,而 bash 中的大多數東西如果沒有崩潰,就會返回零。即使 sed 沒有找到任何可替代的東西,它也會返回零,所以這幾乎總是會發生

最後\的 使它忽略換行符,因此下一行的命令也會被執行,除非某些東西不起作用

所以基本上它正在改變requiredoptional刪除額外的空格,但希望這可以幫助你弄清楚sed 's/thing/otherThing/'一般情況下是什麼

引用自:https://unix.stackexchange.com/questions/700495