iT邦幫忙

2021 iThome 鐵人賽

DAY 14
1
Software Development

系統與服務雜談系列 第 14

sed - 6 Hold Space簡介

  • 分享至 

  • xImage
  •  

前篇回顧
sed - 簡介 讀取編輯文字檔的好工具
sed - 2 Pattern
sed - 3 Delete command
sed - 4 Write commands
sed - 5 Replace command

之前講到的sed工作流程, 其實還有個Hold Space, 一個保留空間, 預設是保留上一行的行內容
https://ithelp.ithome.com.tw/upload/images/20210921/20104930D96jrxyrMu.png
有了這HoldSpace, 我們能做到更多樣化的操作.
試想一下有上一行的內容, 又有當前該行的內容, 這兩個暫存能做什麼?
Swap就能作到交換兩邊空間的資料

先列舉能影響到Hold Space的幾個常見Command

  • x : 把Pattern Space與Hold Space做交換(exchange)
  • h : 複製pattern space 到hold space (就是覆蓋過去)
  • H : 追加pattern space 到hold space
  • g : 複製hold space 到 pattern space
  • G : 追加hold space 到 pattern space

這裡還得多介紹幾個Command

  • n : 讀取下一行到pattern space
  • N : 追加讀取下一行pattern space, 並且把這兩行當作一行, 兩行中間依然保有第一行的\n換行符號
  • q : 結束sed
  • d : 清空目前的pattern space
  • D : 刪除目前pattern sapce, 遇到\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
https://ithelp.ithome.com.tw/upload/images/20210922/201049302JRnQvQpul.png

開始執行commands, 第一個1!G因為是第一行不做;
接著執行第二個commandh, 將pattern space的內容複製到hold space
https://ithelp.ithome.com.tw/upload/images/20210922/20104930k4dNno78G8.png

然後執行最後一個command$!d, 因為不是最末行所以執行, 把pattern space給清空
https://ithelp.ithome.com.tw/upload/images/20210922/20104930FPVCq4sdf4.png
然後這行沒有EOF, 繼續讀取下一行
將第二行Linux讀入patttern space
https://ithelp.ithome.com.tw/upload/images/20210922/20104930Z9pEFD8GuU.png

開始執行commands, 執行1!G把hold space的內容追加到pattern space
https://ithelp.ithome.com.tw/upload/images/20210922/20104930H9L7T2DEw4.png

接著執行第二個commandh, 將pattern space的內容複製到hold space
https://ithelp.ithome.com.tw/upload/images/20210922/2010493011BdkoKQqX.png

接著執行最後一個command$!d, 因為是最末行所以不執行,
此時pattern space, 內容是Linux -> Windows,
碰到EOF就將pattern space的內容做輸出
https://ithelp.ithome.com.tw/upload/images/20210922/20104930rd0BOLJtHS.png

多點內容, 會發現這條命令其實就是倒序

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
https://ithelp.ithome.com.tw/upload/images/20210922/20104930ou8JZifBM3.png

遇到第一個commandN,
追加讀取下一行pattern space, 並且把這兩行當作一行, 兩行中間依然保有第一行的\n換行符號
https://ithelp.ithome.com.tw/upload/images/20210922/20104930sRjJijFqYb.png

然後執行最後一個commandD 刪除目前pattern sapce, 遇到\n為止
所以Windows\n就被刪除, 只剩下Linux, 如下圖
https://ithelp.ithome.com.tw/upload/images/20210922/20104930LxE34YzxGN.png
碰到EOF就將pattern space的內容做輸出

一樣來多點內容, 會發現這條命令其實就是只輸出最後一行

echo 'WIndows\nLinux\nAndroid\nOS' | sed  'N;D' 
> OS

上一篇
sed - 5 Replace command
下一篇
sed - 7 常見案例
系列文
系統與服務雜談33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言