siwen

siwen

😉

sed 命令

sed 流編輯器#

說明:

sed 是一種流編輯器,它是文本處理中非常重要的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩衝區中,稱為 “模式空間”(pattern space),接著用 sed 命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。sed 主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。

語法:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed 執行過程#

image

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' 
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。