共計 8496 個字符,預計需要花費 22 分鐘才能閱讀完成。
本篇內容主要講解“linux 的 sed 命令如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“linux 的 sed 命令如何使用”吧!
一、sed 介紹
sed 全稱(stream editor)流式編輯器,Sed 主要用來自動編輯一個或多個文件、簡化對文件的反復操作、編寫轉換程序等,工作流程如下
1、sed 概述
sed 是一種在線的、非交互式的編輯器,它一次處理一行內容,它是文本處理中非常好的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用 sed 命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出,或者使用 sed - i 選項
#- i 選項就是將本該輸出到屏幕上的內容輸出 / 流入文件中。Sed 主要用來自動編輯一個或多個文件,可以將數據行進行替換、刪除、新增、選取等特定工作,簡化對文件的反復操作,編寫轉換程序等
2、sed 格式
#sed 的命令格式:
sed [options] command file(s);
#sed 的腳本格式:
sed [options] -f scriptfile file(s);
sed 和 grep 不一樣,不管是否找到指定的模式,它的退出狀態都是 0
只有當命令存在語法錯誤時,sed 的退出狀態才不是 0
二、sed 選項與基本用法 1、sed 選項
選項 功能
-e: # 允許多項編輯
-n: # 取消默認的輸出(模式空間的內容輸出), 只打印模式匹配的行;-i: #inplace,就地編輯, 直接修改文件內容;
-r: # 支持擴展元字符
-f: # 指定 sed 腳本文件名
- h 或 --help: # 顯示幫助;- V 或 --version: # 顯示版本信息
sed -r p /etc/passwd
sed -r -n p /etc/passwd
# 文件的一行行內容相當與水流,連續兩個 - e 就是設置了兩道關卡
[root@aliyun ~]# sed test.txt
1111111
2222222egon
333333egon
444444egon
555555eon
[root@aliyun ~]# sed -e 3d -e 1d test.txt
2222222egon
444444egon
555555eon
[root@aliyun ~]# sed -rn -e 1,3d -e p test.txt
444444egon
555555eon
[root@aliyun ~]#
555555eon
[root@aliyun ~]#
2、sed 命令組成
命令由”地址 + 命令“兩部分組成,命令如 p、d,更多詳解第三章節,本節我們主要介紹地址
地址用于決定對流入模式空間的哪些行進行編輯,如果沒有指定地址,sed 將處理流入模式空間的所有行。
1)數字
sed -n p /etc/passwd
sed -n 1,3p /etc/passwd
sed 1,47d /etc/passwd
2)正則表達式
與 grep 一樣,sed 在文件中查找模式時也可以使用正則表達式 (RE) 和各種元字符。正則表達式是
括在斜杠間的模式,用于查找和替換,以下是 sed 支持的元字符。# 使用基本元字符集
^, $, ., *, [], [^], \ \ ,\(\),\{\}
# 使用擴展元字符集
?, +, { }, |, ( )
# 使用擴展元字符的方式:轉義,如 \+
- r 參數,如 sed -r
[root@aliyun ~]# cat test.txt
1111111
2222222egon
333333egon
444444egon
555555eon
[root@aliyun ~]# sed -rn /egon/p test.txt
2222222egon
333333egon
444444egon
[root@aliyun ~]#
3)數字 + 正則表達式
[root@aliyun ~]# cat test.txt
1111111
2222222egon
333333egon
444444egon
555555eon
[root@aliyun ~]# sed -rn 1,/egon/p test.txt
1111111
2222222egon
[root@aliyun ~]#
# 1,8p 代表打印 1 到 8 行,1,/egon/p 則代表取從第 1 行到首次匹配到 /egon/ 的行
3、cregexpc
地址可以是正則表達式,而正則表達式需要放置在 \c 與 c 中間,其中 c 可以是任意字符,但必須要加 \ 轉義
[root@aliyun ~]# cat test.txt
1111111
2222222egon
333333egon
444444egon
555555eon
[root@aliyun ~]# sed -rn #egon#p test.txt
[root@aliyun ~]# sed -rn \#egon#p test.txt
2222222egon
333333egon
444444egon
[root@aliyun ~]#
如果 c 是左斜杠, 不需要轉義也可以
[root@aliyun ~]# sed -rn \/egon/p test.txt
2222222egon
333333egon
444444egon
[root@aliyun ~]# sed -rn /egon/p test.txt
2222222egon
333333egon
444444egon
[root@aliyun ~]#
如果匹配的正則里有左斜杠,要么將正則轉義,要么將 c 轉義
[root@aliyun ~]# cat a.txt
/etc/egon/666
[root@aliyun ~]# sed -rn //etc/egon/666/p a.txt # 錯誤
sed: -e expression #1, char 0: no previous regular expression
[root@aliyun ~]# sed -rn /\/etc\/egon\/666/p a.txt # 正則轉義
/etc/egon/666
[root@aliyun ~]# sed -rn #/etc/egon/666#p a.txt # 轉義 c,必須是 \c
[root@aliyun ~]# sed -rn \#/etc/egon/666#p a.txt # 轉義 c
/etc/egon/666
[root@aliyun ~]#
[root@aliyun ~]# sed -ri /\/etc\/egon\/666/s/.*/xxx/ a.txt
[root@aliyun ~]# cat a.txt
[root@aliyun ~]#
三、sed 常用命令
sed 命令告訴 sed 對指定行進行何種操作,包括打印、刪除、修改等。
1、sed 常用的參數
命令 功能
a 在當前行后添加一行或多行
c 用新文本修改(替換)當前行中的文本
d 刪除行
i 在當前行之前插入文本
l 會用 $ 符號標識出文件中看不到的字符的位置
p 打印行
n 把下一行內容讀入模式空間,后續的處理命令處理的都是剛讀入的新內容
q 結束或退出 sed,不會將后續內容讀入模式空間
r 從文件中讀
! 對所選行以外的所有行應用命令
s 用一個字符串替換另一個
w 將行寫入文件
y 將字符轉換為另一字符(不支持正則表達式),y/egon/1234/ e- 1 g- 2 o- 3 n- 4
h 把模式空間里的內容復制到暫存緩沖區(覆蓋)
H 把模式空間里的內容追加到暫存緩沖區
g 取出暫存緩沖區的內容,將其復制到模式空間,覆蓋該處原有內容
G 取出暫存緩沖區的內容,將其復制到模式空間,追加在原有內容后面
N 追加下一個輸入行到模板塊后面并在二者間嵌入一個新行,改變當前行號碼;
x 交換暫存緩沖區與模式空間的內容
替換標志 s
g 在行內進行全局替換
i 忽略大小寫
t label if 分支,從最后一行開始,條件一旦滿足或者 T,t 命令,將導致分支到帶有標號的命令處,或者到腳本的末尾;
T label 錯誤分支,從最后一行開始,一旦發生錯誤或者 T,t 命令,將導致分支到帶有標號的命令處,或者到腳本的末尾;
w file 寫并追加模板塊到 file 末尾;
W file 寫并追加模板塊的第一行到 file 末尾;
! 表示后面的命令對所有沒有被選定的行發生作用;
= 打印當前行號;
# 把注釋擴展到下一個換行符以前;
########################sed 替換標記 #######################
g 表示行內全面替換;
p 表示打印行;
w 表示把行寫入一個文件;
x 表示互換模板塊中的文本和緩沖區中的文本;
y 表示把一個字符翻譯為另外的字符(但是不用于正則表達式);
\1 子串匹配標記;
已匹配字符串標記;
######################sed 元字符集 #######################
^ 匹配行開始,如:/^sed/ 匹配所有以 sed 開頭的行;
$ 匹配行結束,如:/sed$/ 匹配所有以 sed 結尾的行;
. 匹配一個非換行符的任意字符,如:/s.d/ 匹配 s 后接一個任意字符,最后是 d;
* 匹配 0 個或多個字符,如:/*sed/ 匹配所有模板是一個或多個空格后緊跟 sed 的行;
[] 匹配一個指定范圍內的字符,如 /[ss]ed/ 匹配 sed 和 Sed;
[^] 匹配一個不在指定范圍內的字符,如:/[^A-RT-Z]ed/ 匹配不包含 A - R 和 T - Z 的一個字母開頭,緊跟 ed 的行;
\(..\)匹配子串,保存匹配的字符,如 s /\(love\)able/\1rs,loveable 被替換成 lovers;
保存搜索字符用來替換其他字符,如 s /love/** **/,love 這成 **love**;
\ 匹配單詞的開始,如:/\
\ 匹配單詞的結束,如 /love\ / 匹配包含以 love 結尾的單詞的行;
x\{m\} 重復字符 x,m 次,如:/0\{5\}/ 匹配包含 5 個 0 的行;
x\{m,\} 重復字符 x,至少 m 次,如:/0\{5,\}/ 匹配至少有 5 個 0 的行;
x\{m,n\} 重復字符 x,至少 m 次,不多于 n 次,如:/0\{5,10\}/ 匹配 5~10 個 0 的行;
2、sed 的實列
替換操作:s 命令
替換文本中的字符串: sed s/book/books/ file
- n 選項和 p 命令一起使用表示只打印那些發生替換的行: sed -n s/test/TEST/p file
直接編輯文件選項 -i,會匹配 file 文件中每一行的第一個 book 替換為 books
sed -i s/book/books/g file
全面替換標記 g
使用后綴 /g 標記會替換每一行中的所有匹配: sed s/book/books/g file
當需要從第 N 處匹配開始替換時,可以使用 /Ng: echo sksksksksksk | sed s/sk/SK/2g
skSKSKSKSKSK
echo sksksksksksk | sed s/sk/SK/3g
skskSKSKSKSK
echo sksksksksksk | sed s/sk/SK/4g
skskskSKSKSK
以上命令中字符 / 在 sed 中作為定界符使用,也可以使用任意的定界符
sed s:test:TEXT:g
sed s|test|TEXT|g
定界符出現在樣式內部時,需要進行轉義: sed s/\/bin/\/usr\/local\/bin/g
刪除操作:d 命令
刪除空白行: sed /^$/d file
刪除文件的第 2 行: sed 2d file
刪除文件的第 2 行到末尾所有行: sed 2,$d file
刪除文件最后一行: sed $d file
刪除文件中所有開頭是 test 的行: sed /^test/ d file
已匹配字符串標記
正則表達式 \w\+ 匹配每一個單詞,使用 [ ] 替換它, 對應于之前所匹配到的單詞: echo this is a test line | sed s/\w\+/[ ]/g
[this] [is] [a] [test] [line]
所有以 192.168.0.1 開頭的行都會被替換成它自已加 localhost: sed s/^192.168.0.1/ localhost/ file 192.168.0.1localhost
子串匹配標記 \1
匹配給定樣式的其中一部分: echo this is digit 7 in a number | sed s/digit \([0-9]\)/\1/
this is 7 in a number
命令中 digit 7,被替換成了 7。樣式匹配到的子串是 7,\(..\) 用于匹配子串,對于匹配到的第一個子串就標記為 \1,依此類推匹配到的第二個結果就是 \2,例如: echo aaa BBB | sed s/\([a-z]\+\) \([A-Z]\+\)/\2 \1/
BBB aaa
love 被標記為 1,所有 loveable 會被替換成 lovers,并打印出來: sed -n s/\(love\)able/\1rs/p file
組合多個表達式
sed 表達式 | sed 表達式 等價于:
sed 表達式; 表達式
sed 表達式可以使用單引號來引用,但是如果表達式內部包含變量字符串,就需要使用雙引號。 test=hello
echo hello WORLD | sed s/$test/HELLO
HELLO WORLD
選定行的范圍:,(逗號)所有在模板 test 和 check 所確定的范圍內的行都被打印: sed -n /test/,/check/p file
打印從第 5 行開始到第一個包含以 test 開始的行之間的所有行: sed -n 5,/^test/p file
對于模板 test 和 west 之間的行,每行的末尾用字符串 aaa bbb 替換: sed /test/,/west/s/$/aaa bbb/ file
多點編輯:e 命令
- e 選項允許在同一行里執行多條命令: sed -e 1,5d -e s/test/check/ file
上面 sed 表達式的第一條命令刪除 1 至 5 行,第二條命令用 check 替換 test。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那么第一個替換命令將影響第二個替換命令的結果。和 -e 等價的命令是 --expression: sed --expression= s/test/check/ --expression= /love/d file
從文件讀入:r 命令
file 里的內容被讀進來,顯示在與 test 匹配的行后面,如果匹配多行,則 file 的內容將顯示在所有匹配行的下面: sed /test/r file filename
寫入文件:w 命令
在 example 中所有包含 test 的行都被寫入 file 里: sed -n /test/w file example
追加(行下):a\ 命令
將 this is a test line 追加到 以 test 開頭的行后面: sed /^test/a\this is a test line file
在 test.conf 文件第 2 行之后插入 this is a test line: sed -i 2a\this is a test line test.conf
插入(行上):i\ 命令 將 this is a test line 追加到以 test 開頭的行前面: sed /^test/i\this is a test line file
在 test.conf 文件第 5 行之前插入 this is a test line: sed -i 5i\this is a test line test.conf
下一個:n 命令
如果 test 被匹配,則移動到匹配行的下一行,替換這一行的 aa,變為 bb,并打印該行,然后繼續: sed /test/{ n; s/aa/bb/; } file
變形:y 命令
把 1~10 行內所有 abcde 轉變為大寫,注意,正則表達式元字符不能使用這個命令: sed 1,10y/abcde/ABCDE/ file
退出:q 命令
打印完第 10 行后,退出 sed sed 10q file 保持和獲取:h 命令和 G 命令 在 sed 處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩沖區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將打印在屏幕上。接著模式空間被清空,并存入新的一行等待處理。 sed -e /test/h -e $G file
在這個例子里,匹配 test 的行被找到后,將存入模式空間,h 命令將其復制并存入一個稱為保持緩存區的特殊緩沖區內。第二條語句的意思是,當到達最后一行后,G 命令取出保持緩沖區的行,然后把它放回模式空間中,且追加到現在已經存在于模式空間中的行的末尾。在這個例子中就是追加到最后一行。簡單來說,任何包含 test 的行都被復制并追加到該文件的末尾。保持和互換:h 命令和 x 命令
互換模式空間和保持緩沖區的內容。也就是把包含 test 與 check 的行互換: sed -e /test/h -e /check/x file
腳本 scriptfile
sed 腳本是一個 sed 的命令清單,啟動 Sed 時以 - f 選項引導腳本文件名。Sed 對于腳本中輸入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多個命令,要用分號分隔。以 #開頭的行為注釋行,且不能跨行。 sed [options] -f scriptfile file(s)
打印奇數行或偶數行
sed -n n test.txt # 奇數行 sed -n p test.txt # 偶數行
sed -n 1~2p test.txt # 奇數行 sed -n 2~2p test.txt # 偶數行
打印匹配字符串的下一行
grep -A 1 SCC URFILE
sed -n /SCC/{n;p} URFILE
awk /SCC/{getline; print}
3、sed 命令示例
打印命令:p
# sed -r /egon/p a.txt
# sed -r -n /egon/p a.txt
刪除命令:d,注意用單引號
# sed -r 3d a.txt
# sed -r 3,$d a.txt
# sed -r $d a.txt
# sed -r /egon/d a.txt
# sed -r 1,/egon/{/egon/d} a.txt # 只刪除模式匹配成功的第一行
[root@hzl ~]#
[root@hzl ~]# sed -r /egon/d a.txt # 只刪除模式匹配成功的所有行
Egon111111
333Egon333
5555555555
6666666666
8888888888
[root@hzl ~]# sed -r 1,/egon/{/egon/d} a.txt # 只刪除模式匹配成功的第一行
Egon111111
333Egon333
444444egon
5555555555
6666666666
egon777777
8888888888
# sed -r s/egon/Bigegon/ a.txt
# sed -r s/egon/Bigegon/g a.txt
# sed -r s/^egon/Bigegon/g a.txt
# sed -r -n s/root/egon/gip /etc/passwd
# sed -r s/[0-9]$/ .change/ a.txt # 代表取到匹配成功的整行內容
# sed -r s/^([a-zA-Z]+)([^[a-zA-Z]+)/\2\1/ a.txt
# sed -r s#egon#bigegon#g a.txt
多重編輯命令:e
# sed -r -e 1,3d -e s/[Ee]gon/EGON/g a.txt # 在前一個 - e 的基礎之上進行第二個 - e 操作
# sed -r 1,3d;s/[Ee]gon/EGON/g a.txt
# sed -r 3{s/[0-9]/x/g;s/[Ee]gon/EGON/g} a.txt # 只處理第三行
# sed -r 1,3{s/[0-9]/x/g;s/[Ee]gon/EGON/g} a.txt # 處理 1 到 3 行
# sed -r -n p a.txt # ; 分隔依次運行,先針對第一行進行 p 操作,再針對所有行進行 p 操作
# sed -r -n 1{p;p} a.txt # 只針對第一行,連續進行兩次 p 操作
反向選擇!
# sed -r 3d a.txt
# sed -r 3!d a.txt
正文完