sed(stream editor)命令是一個面向字符流的非交互式編輯器为障,也就是說sed不允許用戶與它進(jìn)行交互操作肴捉。sed是按行來處理文本內(nèi)容的鬓长。在shell中核蘸,使用sed來批量修改文本內(nèi)容是非常方便的巍糯。
sed命令
sed [選項] [動作] [文件]
sed [選項] -f [scriptfile] [文件]
選項:
-n :使用安靜(silent)模式。在一般 sed 的用法中客扎,所有來自 STDIN 的數(shù)據(jù)一般都會被列出到終端上祟峦。但如果加上 -n 參數(shù)后,則只有經(jīng)過sed 特殊處理的那一行(或者動作)才會被列出來徙鱼。
-e :直接在命令列模式上進(jìn)行 sed 的動作編輯宅楞;
-f :直接將 sed 的動作寫在一個文件內(nèi), -f filename 則可以運行 filename 內(nèi)的 sed 動作袱吆;
-r :sed 的動作支持的是延伸型正規(guī)表示法的語法厌衙。(默認(rèn)是基礎(chǔ)正規(guī)表示法語法)
-i :直接修改讀取的文件內(nèi)容,而不是輸出到終端绞绒。
動作:
a :新增行迅箩, a 的后面可以是字串,而這些字串會在新的一行出現(xiàn)(目前的下一行)
c :取代行处铛, c 的后面可以接字串饲趋,這些字串可以取代 n1,n2 之間的行
d :刪除行拐揭,因為是刪除,所以 d 后面通常不接任何參數(shù)奕塑,直接刪除地址表示的行堂污;
i :插入行, i 的后面可以接字串龄砰,而這些字串會在新的一行出現(xiàn)(目前的上一行)盟猖;
p :列印,亦即將某個選擇的數(shù)據(jù)印出换棚。通常 p 會與參數(shù) sed -n 一起運行
s :替換式镐,可以直接進(jìn)行替換的工作,通常這個 s 的動作可以搭配正規(guī)表示法,例如 1,20s/old/new/g 一般是替換符合條件的字符串而不是整行
刪除行
# 刪除1-3行固蚤,包括第一行和第三行
sed '1,3d' test.txt
# 刪除第一行后面的所有行
sed '1,$d' test.txt
# 刪除第一行
sed '1d' test.txt
# 刪除所有包含2的行娘汞。正則表達(dá)式寫在雙斜杠之間。
sed '/2/d' test.txt
# 刪除以2開頭的行
sed '/^2/d' test.txt
# 刪除空行
sed '/^$/d' test.txt
新增行
# 在指定行的后面添加內(nèi)容夕玩,a的前面沒有地址限定則在所有行的后面都會添加指定字符串
sed '1a hello world' test.txt
# 在指定行的前面插入一行
sed '1i hello world' test.txt
替換行
# 替換第一行的內(nèi)容
sed '1c hello world' test.txt
# 替換以2開頭的行
sed '/^2/c hello world' test.txt
所有的新增你弦,刪除,替換行燎孟,這些命令前面的地址修飾都可以指定地址空間禽作,也都可以使用正則表達(dá)式,命令會應(yīng)用在選出的符合地址條件的所有行上面
替換部分字符串
# 替換第一個aa為AA
sed 's/aa/AA/' test.txt
# 替換所有的aa為AA
sed 's/aa/AA/g' test.txt
# 進(jìn)行地址選擇
sed '1s/aa/AA/g' test.txt
sed '5,$s/aa/AA/g' test.txt
sed '/^[0-9]/s/aa/AA/g' test.txt
# 從第二行開始替換
sed 's/aa/AA/2g' test.txt
搜索并輸出內(nèi)容
# 輸出第二行
sed -n '2p' test.txt
-n 選項一般是與p命令聯(lián)合使用的揩页,其他的增加旷偿,刪除,替換行的命令是不需要 -n 選項的
將修改應(yīng)用到文件中
sed -i '2d' test.txt
正則中的元字符
$ 表示行尾
^ 表示行首
[a-z0-9]表示字符范圍
[^]表示除了字符集中的字符以外的字符
sed的正則中 \(\) 和 \{m,n\} 需要轉(zhuǎn)義
. 表示任意字符
* 表示零個或者多個
\+ 一次或多次
\? 零次或一次
\| 表示或語法