Ubuntu

使 sed 通過 2 行或更多行(在這種情況下為所有行)而不是僅一行

  • March 5, 2018

我使用帶有 Bash 的 Ubuntu 16.04,我應該為我在 Nginx 環境中擁有的特定網站啟用 http2。


本機,該實用程序sed在第一個相關行的第一個實例上進行文本處理(使用g參數將使其處理第一個相關行上的所有實例),但我希望在2 行或更多行上執行特定操作(所有實際上是行)。

我看了看,man sed發現-l讓你指定要使用的行數的論點(如果我理解正確的話),但我希望在所有行上工作,而不依賴於特定數量的行。

我遇到的特殊情況是我嘗試將這兩個sed操作統一為一個:

s_a="/etc/nginx/sites-available/"
$domain="example.com"
sed -i "s/listen 443 ssl default_server;/listen 443 ssl http2 default_server;/" $s_a/$domain.conf
sed -i "s/listen [::]:443 ssl default_server;/listen [::]:443 ssl http2 default_server;/" $s_a/$domain.conf

sed我可以將這兩個操作統一為:

sed -i "s/443 ssl default_server/443 ssl http2 default_server/" $s_a/$domain.conf

我認為確保在如此方便的一行操作中覆蓋所有相關行的最安全方法是使用一些參數,但我不知道這是否可以用-l參數來完成,或者我必須使用正則表達式。

這裡似乎有一個錯誤,因為:

sed -i "s/443 ssl default_server/443 ssl http2 default_server/" $s_a/$domain.conf

會正常工作;它將在所有$s_a/$domain.conf.

-l僅與l命令有關。

sed處理所有行,除非您告訴它不要這樣做,例如提前退出。該命令的g選項s僅影響每行處理多次出現的搜尋詞的方式:如果沒有g,則僅替換任何給定行上的第一個匹配項,而使用g,則替換所有匹配項。在這兩種情況下,替換都會應用於所有行。

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