理解sed高級命令



sed工作原理

  • sed: stream editor,流編輯器;與vim不同,sed是一種非交互式編輯器,它使用預先設定好的編輯指令對輸入的文本進行編輯,主要依靠正則表達式
  • sed工作原理:

1、 讀一行到Pattern space
2、 若條件匹配則跳到第三步,若不匹配則打印當前模式空間內容,清空模式空間,跳到第一步
3、 執行相關命令(p命令會打印當前模式空間內容),命令執行完畢後,打印當前模式空間內容,清空模式空間,然後跳到第一步

  • 注意下面6點:
  1. 命令語句最後默認要清空模式空間
  2. 只要清空模式空間,都默認要把當前模式空間內容先輸出到stdout(若帶-n選項則這步不輸出)
  3. 模式空間默認爲空
  4. 保持空間默認爲 \n (換行符)
  5. 子命令n可以理解成,讀入下一行前先清空模式空間,所以讀入下一行前默認會把當前模式空間輸出到stdout
  6. 子命令x就只是交換內容,不要理解成清空空間

sed高級命令

x:  模式空間和保持空間內容互換
d:  刪除當前模式空間內容
D:  刪除模式空間中的第一行
h:  複製模式空間內容覆蓋掉保持空間
H:  追加模式空間內容到保持空間
g:  複製保持空間內容覆蓋掉模式空間
G:   追加保持空間內容到模式空間
n:  清空前一行 ,然後提前讀入下一行到模式空間
N:  提前讀入下一行追加到模式空間
p:  打印當前模式空間的內容
P:  打印當前模式空間中的第一行


分步列出執行步驟

  • 用sed實現tac命令功能
[root@localhost ~/test]$cat file 
11
88
22
[root@localhost ~/test]$sed -n '1!G;h;$p' file 
22
88
11
[root@localhost ~/test]$
  • 用表格的形式把上面命令的執行步驟列出來,幫助理解(1!G:除來第一行其餘都執行G命令;&p:只有最後一行才執行p命令)
  • 讀入第1行:11\n
空間內容\執行流程 起始值 讀入一行 1!G h $p 清空模式空間,帶-n選項則這步不輸出到stdout
模式空間內容 11\n 11\n 11\n 11\n
保持空間內容 \n \n 11\n 11\n 11\n 11\n
stdout內容
  • 讀入第2行:88\n
空間內容\執行流程 起始值 讀入一行 1!G h $p 清空模式空間,帶-n選項則這步不輸出到stdout
模式空間內容 88\n 88\n11\n 88\n11\n 88\n11\n
保持空間內容 11\n 11\n 11\n 88\n11\n 88\n11\n 88\n11\n
stdout內容
  • 讀入第3行:22\n
空間內容\執行流程 起始值 讀入一行 1!G h $p 清空模式空間,帶-n選項則這步不輸出到stdout
模式空間內容 22\n 22\n88\n11\n 22\n88\n11\n 22\n88\n11\n
保持空間內容 88\n11\n 88\n11\n 88\n11\n 22\n88\n11\n 22\n88\n11\n 22\n88\n11\n
stdout內容 22\n88\n11\n 22\n88\n11\n
  • 最後stdout內容就是22\n88\n11\n,如下顯示出來內容和sed命令執行結果一樣:
[root@localhost ~/test]$echo -e -n "22\n88\n11\n"
22
88
11
[root@localhost ~/test]$
[root@localhost ~/test]$sed -n '1!G;h;$p' file 
22
88
11
[root@localhost ~/test]$


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章