sed (Stream Editor), 相較於之前的grep、awk都比較篇查找排版工具, sed則是輸出與修改工具.
跟awk一樣也是以行
為逐筆進行的方式.
也是能分析日誌與文件, 但更多都是修改配置文件用.
針對文件的行做增
、刪
、替換
; 或者對字串做替換
或取得
.
但sed本身改變的不是原來的文件內容, 而是pattern space內的, 除非重新定向至原檔案
做輸出.
跟awk很像, 只是sed先把資料讀取進pattern space
一個緩衝區空間.
其實還有另一個hold space
後面再補充.
pattern space並不會主動被清空,
而是要透過sed的d (delete pattern space)
或-n
這option或是是輸出到stdout上時.
每一行讀取出來要放到pattern space時, 都會把末端的\n
給去掉, 再放到pattern space內.
# 命令行格式
sed [option] "pattern command" file(s)
# 腳本格式
sed [option] -f scriptName file(s)
# 管道格式
stdout | sed [option] "pattern command"
格式其實跟awk、grep雷同, 要就讀取檔案, 不然就是從管線讀取
pattern這裡大部分也都還是/Regex/
, 後面接著p(print) command
先展示沒有pattern只有command的時候
sed 'p' python.txt
sed預設是會把讀取到的每行文字跟匹配到的行內容, 都做輸出;
因為沒有pattern做匹配, 等於就全部都匹配到了.
因為sed預設是會把patern space的每一行也輸出,
搭配-n
(slient), 就不會把pattern space的內容做輸出.
但後面的command是p
所以只要pattern匹配到的行內容還是會做輸出.
sed -n 'p' python.txt
新增針對Python字串做匹配
sed -n '/Python/p' python.txt
如果pattern command寫得很長, 也能把pattern command寫在檔案內, 透過-f
來執行調用
# 準備sed命令檔案
cat > edit.sed <<EOF
/Python/p
EOF
sed -n -f edit.sed python.txt
得到跟上圖一樣的結果
sed預設只會針對1組pattern command
做操作
如果需要針對多組pattern command
做操作, 需要搭配-e
(add script to be excuted)
在每組pattern command前加上-e
sed -n -e '/cat/p' -e '/bat/p' python.txt
>cat
>bat
上組操作, 好像能搭配Regex的or來匹配多組字串
sed -n '/cat|bat/p' python.txt
按下去, 啥都沒有顯示???
sed其實跟grep很像, 默認不吃Regex的一些符號, 此時需要搭配-r
sed -n -r '/cat|bat/p' python.txt
>cat
>bat
sed最重要的編輯功能呢? 別急!
這裡pattern前面有個s
, 就是搜尋並取代的意思, 搜尋/目標對象/取代對象/
多個command中間要用;
隔開
sed -n 's/Python/Go/g;p' python.txt
但會發現python.txt還是原來的內容阿??? 黑人問號!
回到一開始sed的特性, sed預設不修改原來檔案, 只是在pattern space內做操作並輸出
如果想修改需要搭配-i
(edit file in place)
sed -i 's/Python/Go/g' python.txt
試想看看, 要是有一組設定檔, 需要同時對${client_host}
這樣的設定, 在不同環境做修改時,
sed是很方便的工具, 且基本上Linux發行版本上預設都有安裝.
或者使用envsubst會更為方便