前篇回顧
sed - 簡介 讀取編輯文字檔的好工具
sed - 2 Pattern
sed - 3 Delete command
sed - 4 Write commands
sed - 5 Replace command
之前講到的sed工作流程, 其實還有個Hold Space
, 一個保留空間, 預設是保留上一行的行內容
有了這HoldSpace, 我們能做到更多樣化的操作.
試想一下有上一行的內容, 又有當前該行的內容, 這兩個暫存能做什麼?Swap
就能作到交換兩邊空間的資料
先列舉能影響到Hold Space的幾個常見Command
複製
pattern space 到hold space (就是覆蓋過去)追加
pattern space 到hold space複製
hold space 到 pattern space追加
hold space 到 pattern space這裡還得多介紹幾個Command
追加
讀取下一行pattern space, 並且把這兩行當作一行, 兩行中間依然保有第一行的\n換行符號嘗試把以下內容的前兩行位子做互換
Windows
Linux
echo 'WIndows\nLinux' | sed '1!G;h;$!d'
> Linux
> WIndows
我們來一步一步拆解'1!G;h;$!d'
, 多個command用;
做分隔
先看第一個command1!G
, !
是否定的意思, 所以這動作就是第1行不做G的動作.
第二個command就是h
.
最後一個command是$!d
, $
是最末行, 所以就代表最末行不做d的動作.
將第一行Windows讀入pattern space
開始執行commands, 第一個1!G
因為是第一行不做;
接著執行第二個commandh
, 將pattern space的內容複製到hold space
然後執行最後一個command$!d
, 因為不是最末行所以執行, 把pattern space給清空
然後這行沒有EOF, 繼續讀取下一行
將第二行Linux讀入patttern space
開始執行commands, 執行1!G
把hold space的內容追加到pattern space
接著執行第二個commandh
, 將pattern space的內容複製到hold space
接著執行最後一個command$!d
, 因為是最末行所以不執行,
此時pattern space, 內容是Linux -> Windows,
碰到EOF就將pattern space的內容做輸出
多點內容, 會發現這條命令其實就是倒序
echo 'WIndows\nLinux\nAndroid\nOS' | sed '1!G;h;$!d'
> OS
> Android
> Linux
> WIndows
再來,跟Hold space無關, 只是用上面的講解方法, 講解只輸出最後一行
echo 'WIndows\nLinux' | sed 'N;D'
> Linux
一樣來做command分解
先把第一行Windows讀入pattern space
遇到第一個commandN
,追加
讀取下一行pattern space, 並且把這兩行當作一行, 兩行中間依然保有第一行的\n換行符號
然後執行最後一個commandD
刪除目前pattern sapce, 遇到\n為止
所以Windows\n
就被刪除, 只剩下Linux, 如下圖
碰到EOF就將pattern space的內容做輸出
一樣來多點內容, 會發現這條命令其實就是只輸出最後一行
echo 'WIndows\nLinux\nAndroid\nOS' | sed 'N;D'
> OS