【Linux】shell學習之sed


sed替換命令

使用該命令,可以將特定字符串或匹配的規則表達式用另一個字符串替換。

 

sed 's/88/--/' filename    將filename每行第一次出現的88用字符串--替換,然后將該文件內容輸出到標准輸出
sed 's/88/--/g' filename    附加g選項告訴sed執行全局替換

 

匹配第N個進行替換

N=1

sed '0,/88/s//--/' filename    只匹配到第一個88為止
sed ':a;N;$!ba;s/88/--/' filename

第二個命令

  1. :a 創建一個label a
  2. N 將下一行讀入到pattern space
  3. $! 如果不是最后一行,ba跳轉到label a處
  4. s/a/A/ 替換a為A,只替換一次

步驟1-3(即:a;N;$!ba;)就是為了將filename全部內容讀到模式空間中,然后再進行替換,這樣替換就只會做一次。

 

N=3

第一個命令叫打點記數法,因為sed沒有var++之類的操作來記數。

第二個命令和上面是一樣的原理,全部讀入文本后統一替換第3個匹配的內容。

 

N=last

第一個命令,沒匹配到 /\n88/ 的內容就讀取下一行,然后 ba 跳轉去開始處,如果讀取到88的行呢,就執行后面的 P;D 組合,D也有循環功能,一直把匹配 \n88 內容的第一行打印,刪除,直到不匹配/\n88/(因為換行符已經被打印出去了,所以不再會匹配到 \n88),這時候才繼續往下讀,如果又讀到88的行,那么又執行P;D循環,同上操作。一直到匹配到最后一個88的行,繼續讀取到末行時執行替換,N 因為沒有下一行可讀,所以會自動中止命令,因為沒有 -n 參數會打印 pattern space 里的內容到屏幕,所以就不會再執行后面的 ba 避免了死循環,這樣的用法只存在於 GNU sed ,大家注意。所以這整個流程只會替換最后一個88。
第二個命令和上面的一樣,也是全部讀進 pattern space 里,最后利用正則的貪婪替換掉最后一個88。

 

注意兩者區別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM