1. sed打印某行到某行之間的內容
2. sed 轉換大小寫
- 將單詞首字母轉化大寫
- 將所有小寫轉化大寫
3. sed 在某一行最後面添加一個數字
4. 刪除某行到最後一行
解析: {:a;N;$!ba;d}
:a : 是做一個標識符, 標識符名稱爲 a(此處名稱可以自定義)
N 將下一行文本讀入 待操作空間(pattern space), sed操作是先將一行讀入(pattern space) 模式空間, 然後根據命令處理這一行文本.
$!ba 可以拆解爲 b:流程控制 回到前面一個標記 :(分號標記點) 的位置 即 a 標記,(這裏的b 是 break 的意思) $! 爲 b語句的判斷條件, 如果滿足這個條件即執行 break :a 這個動作,
# 這個 :a COMMAND; $!b:a 有點像是C語言的 do{}while(); 語句 這個do{} 就是:a 以及後繼的命令, while() 就是 $!b:a , 而 $! 僅僅是 while() 裏面的判斷條件.
# 這裏的僅僅是有點相似, 準確的說 :a COMMAND; $!b:a 更像是 彙編或C 裏面 loop: goto 語句, 一個標記點, 另一個是跳轉.
---------
/^abc/ # 匹配 abc 開頭的行
p # 打印上面匹配到的行
:a # 做標記
N # 將該行的下一行讀入 模式空間
$!ba # 滿足 $!(沒有到最後一行) 條件時 跳回 :a 標記處
d # 當上面語句執行完畢時,執行該語句, 刪除
:a; COMMAND ;//ba
語句實驗
- 上面操作 是 匹配
/.*/
所有內容,{:a;N;3!ba}
將 第三行以及之前的內容讀入pattern 空間內,;p
將 pattern 空間內的 內容 打印出來.
5. sed 的空間概念
sed 命令在處理文件內容時, 會將當前行存儲在臨時緩衝區內, 稱爲(pattern space), 接着sed 命令處理緩衝區內的內容, 處理結束後, 會將緩衝區內的內容按照命令指定方式處理(默認會print, 也可以指定d :delete) 接着會清理緩衝區, 處理下一行, 重複上面動作.
sed 還有一段保留空間(hold space) 相當於倉庫, 用戶可以根據 需要將當前行內容放入該空間中, 便於後面需要時取出.
空間的相關操作:
d Delete 了 pattern space 的內容
h H 複製/追加 pattern space 的內容到 hold space
g G 複製/追加 hold space 的內容到 pattern space
x 交換 hold space 和pattern space內容
n 讀取下一個輸入行, 用下一個命令處理, 而不是從第一個命令開始處理
N 讀取下一行到 pattern space 內, 和pattren space 內原有的內容作爲一行處理. 會改變當前的行號
- 將
123
開頭的行移到ee
開頭的行, 並將ee
行 放到最後一行. 使用 hold space 做存儲可以很方便做到這些.
6. sed 中遇到N 會將下一行連帶彙總在一起處理
7. 打印2到6行含某個字符串的行
8. awk 中使用外部變量
awk -v val=$val
9.awk 合併文件
10. 過濾多個關鍵字
END