sed工作原理
- sed: stream editor,流編輯器;與vim不同,sed是一種非交互式編輯器,它使用預先設定好的編輯指令對輸入的文本進行編輯,主要依靠正則表達式
- sed工作原理:
1、 讀一行到Pattern space
2、 若條件匹配則跳到第三步,若不匹配則打印當前模式空間內容,清空模式空間,跳到第一步
3、 執行相關命令(p命令會打印當前模式空間內容),命令執行完畢後,打印當前模式空間內容,清空模式空間,然後跳到第一步
- 注意下面6點:
- 命令語句最後默認要清空模式空間
- 只要清空模式空間,都默認要把當前模式空間內容先輸出到stdout(若帶-n選項則這步不輸出)
- 模式空間默認爲空
- 保持空間默認爲 \n (換行符)
- 子命令n可以理解成,讀入下一行前先清空模式空間,所以讀入下一行前默認會把當前模式空間輸出到stdout
- 子命令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]$