sed 流編輯器#
說明:
sed
是一種流編輯器,它是文本處理中非常重要的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩衝區中,稱為 “模式空間”(pattern space),接著用sed
命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。sed
主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。
語法:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
sed 執行過程#
sed 命令選項#
選項 | 作用 |
---|---|
-n | 取消默認 sed 輸出,只輸出處理後的結果,通常與 p 動作一起使用 |
-r | 支持使用擴展正則表達式 |
-i | 直接編輯文件,不使用 -i ,修改的只是緩衝區的內容 |
-e | 多次編輯,和管道符作用一樣 |
-f | 運行 sed 腳本中的編輯命令 |
sed 編輯命令#
動作 | 描述 |
---|---|
a\ | 新增,在當前行下面插入文本 (用 \ 或者空格都可以) |
i\ | 插入,在當前行上面插入文本 |
c\ | 修改,把選定行修改為新的文本 |
d | 刪除,刪除選定行 |
p | 打印,打印匹配的內容,通常與 -n 選項一起使用 |
s | 替換,匹配內容並進行替換,支持正則 |
n | 讀取下一個輸入行,然後執行下一個命令 |
w | 保存模式匹配的行至指定文件 |
r | 讀取指定文件的文本至模式空間中匹配到的行後 |
= | 為模式空間中的行打印行號 |
! | 模式空間中匹配行取反處理 |
sed 替換標記#
符號 | 描述 |
---|---|
g | 行內全部替換,不寫默認替換每行第一個,ng 表示替換第 n 次開始匹配到的內容 |
\n | 子字符串匹配標記;\n 表示第幾個分組裡的內容 |
& | 已匹配字符串標記 |
s 替換命令說明
"定界符"
- 替換命令中,常用
/
作為定界符,也可以使用自定義的定界符,如:
、#
、@
等- 定界符出現在內部時,需要進行轉義,如
sed 's:[0-9]:\::' test.txt
使用:
作為定界符,將所有數字替換成:
"組合多個表達式"
- sed 替換命令可以結合其他命令一起使用,例如將第一行所有小寫字母替換成
#
並進行打印
shell sed '1s/[a-z]/#/gp' test.txt
- 其他命令也可以組合多個表達式使用,可以有以下三種寫法(在同一行裡執行多個命令,受先後順序影響)
sed '表達式1' | sed '表達式2' sed '表達式1; 表達式2' sed -e '表達式1' -e '表達式2'`
"子字符串匹配(反向引用)"
- 匹配給定模式中的一部分,配合
()
分組使用,\n
就表示匹配第幾個分組的結果
"已匹配字符串"
- 使用
&
來表示匹配到的每一個內容,也可以使用子字符串匹配來實現
sed 匹配範圍#
範圍 | 解釋 |
---|---|
全文 | 全文處理 |
指定行 | 指定文件的某一行 ;'1p' 表示打印第一行 |
指定模式 | /pattern/ 被模式匹配到的每一行; '/^H/' 表示 H 開頭的行 |
指定範圍區間 | 範圍內的每一行;'1,3' 表示第 1 行到第 3 行;'1,+2' 表示第 1 行和後兩行;'$' 表示最後一行 |
指定步長 | 根據步長匹配行;'1~2' 表示 1,3,5,7,... 奇數行; '2~2' 表示 2,4,6,8... 偶數行 |
行範圍和模式範圍可以組合成範圍區間使用
sed 命令示例#
# 打印第5行
[root@localhost ~]# sed -n '5p' test.txt
# 在每一行下面添加文本"day day up"(不修改原文件)
[root@localhost ~]# sed 'a day day up' test.txt
# 在第1行上面添加兩行 "abcde" 和 "ABCDE"
[root@localhost ~]# sed -i '1i abcde\nABCDE' test.txt
# 把最後一行更改為"66666"
[root@localhost ~]# sed -i '$c 66666' test.txt
# 把所有的字符'A'修改為'a'
[root@localhost ~]# sed -i 's/A/a/g' test.txt
# 刪除前2行
[root@localhost ~]# sed -i '1,2d' test.txt
# 將'H'開頭的行寫入文件 file.txt
[root@localhost ~]# sed -n '/^H/w file.txt' test.txt
# 將file.txt文件裡的內容寫入第5行下面
[root@localhost ~]# sed -i '5r file.txt' test.txt
# 刪除'l'開頭的下一行
[root@localhost ~]# sed -i '/^l/{n;d;}' test.txt
# 打印2-5行之外的行
[root@localhost ~]# sed -n '2,5!p' test.txt
# 將所有出現一次以上的字母'b'修改成數字'8'打印出來
[root@localhost ~]# sed -nr 's/b+/8/gp' test.txt
# 在第6行的內容刪除 然後修改所有'*'為'#'
[root@localhost ~]# sed -i -e '5d' -e 's/*/#/g' test.txt
# 新建文件file.sed裡面書寫sed腳本 將test.txt文件中第一行到'?'結尾的行打印出來
[root@localhost ~]# echo "/1,/^A/p" > file.sed
[root@localhost ~]# sed -n -f file.sed test.txt
## 後向引用
-- 先保護後使用
# 將 "hello world" 改成 "[hello] [world]"
[root@localhost ~]# echo "hello world" | sed -r 's/(\w+)/[\1]/g'
[root@localhost ~]# echo "hello world" | sed -r 's/\w+/[&]/g'
# 將每一行第一次連續出現3次的字符串替換成 ‘嗯哼~’
[root@localhost ~]# sed -r -i 's/([a-z])\1\1/嗯哼~/' test.txt
# 獲取linux的ip地址
[root@localhost ~]# ip a s eth0
9: eth0: <> mtu 1500 group default qlen 1
link/ether d8:c4:97:92:73:08
inet 169.254.248.50/16 brd 169.254.255.255 scope global dynamic
valid_lft forever preferred_lft forever
inet6 fe80::5219:3165:3e7d:41fb/64 scope link dynamic
valid_lft forever preferred_lft forever
[root@localhost ~]# ip a s eth0 | sed -nr '3s/(^.*t )(.*)(\/.*$)/\2/gp'
# 使用sed命令將任意3個小寫字母倒置 例如:'abc'改為'cba'
[root@localhost ~]# echo "abc“ | sed -n 's/([a-z])([0-z])(a-z)/\3\2\1/p'