1、sed命令說明
sed
主要是用來將數(shù)據(jù)進(jìn)行選取沃斤、替換映皆、刪除、新增的命令轰枝,grep
捅彻,awk
,sed
稱為是文本操作三劍客鞍陨。
我們看看sed
命令的語法格式:
[root@localhost ~]# sed [選項(xiàng)] '[動作]' 文件名
選項(xiàng):
-
-n
:一般sed
命令會把所有數(shù)據(jù)都輸出到屏幕步淹,如果加入此選擇,則只會把經(jīng)過sed
命令處理的行輸出到屏幕诚撵。 -
-e
:允許對輸入數(shù)據(jù)應(yīng)用多條sed
命令編輯缭裆。 -
-f 腳本文件名
:從sed
腳本中讀入sed
操作。和awk
命令的-f
非常類似寿烟。 -
-r
:在sed
中支持?jǐn)U展正則表達(dá)式澈驼。 -
-i
:用sed
的修改結(jié)果直接修改讀取數(shù)據(jù)的文件,而不是由屏幕輸出筛武。
動作:
-
a \
:追加缝其,在當(dāng)前行后添加一行或多行。添加多行時徘六,除最后一行外内边,每行末尾需要用\
代表數(shù)據(jù)未完結(jié)。(如果不添加多行待锈,就忽略\
) -
c \
:行替換漠其,用c后面的字符串替換原數(shù)據(jù)行,替換多行時竿音,除最后一行外和屎,每行末尾需用\
代表數(shù)據(jù)未完結(jié)。(如果不添加多行春瞬,就忽略\
) -
i \
:插入柴信,在當(dāng)期行前插入一行或多行。插入多行時快鱼,除最后一行外颠印,每行末尾需要用\
代表數(shù)據(jù)未完結(jié)纲岭。(如果不添加多行,就忽略\
) -
d
:刪除线罕,刪除指定的行止潮。 -
p
:打印,輸出指定的行钞楼。 -
s
:字串替換喇闸,用一個字符串替換另外一個字符串。格式為行范圍 s/舊字串/新字串/g
(和vim中的替換格式類似)询件。
提示:
對于
sed
命令大家要注意燃乍,sed
所做的修改并不會直接改變文件的內(nèi)容(如果是用管道符接收的命令的輸出,這種情況連文件都沒有)宛琅,而是把修改結(jié)果只顯示到屏幕上刻蟹,除非使用-i
選項(xiàng)才會直接修改文件。
小說明:
vim可以直接修改文件內(nèi)容嘿辟,我們使用的也非常多舆瘪,為什么還要學(xué)
sed
命令呢?因?yàn)関im需要我們手動和計算機(jī)交互红伦,需要手動輸入一些編輯指令英古,保存指令,切換模式指令等昙读,才能完成vim的編輯操作召调。
在Shell中很難做到人機(jī)交互,所以vim操作沒有辦法在Shell程序使用蛮浑,因此要通過
sed
命令來完成唠叛,這是Shell中修改文件內(nèi)容最最最主要的方式。
2陵吸、行數(shù)據(jù)操作
使用如下文本student.txt
:
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96,66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
(1)查看文件中的數(shù)據(jù)
我們舉幾個例子來看看sed
命令到底是干嘛的玻墅。
查看下student.txt
文件的第二行介牙,那么就可以利用p
動作壮虫,執(zhí)行如下命令:
[root@localhost tmp]# sed '2p' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
從上面的結(jié)果可以看出,p
命令確實(shí)輸出了第二行數(shù)據(jù)环础,但是sed
命令還會把所有數(shù)據(jù)都輸出一次囚似,這時就會看到這個比較奇怪的結(jié)果,第二行的數(shù)據(jù)有兩次的輸出线得。
那如果想指定輸出某行數(shù)據(jù)饶唤,就需要-n
選項(xiàng)的幫助。
[root@localhost tmp]# sed -n '2p' student.txt
1 Tangs 88 87 86 85.55
(2)刪除文件中的數(shù)據(jù)
刪除student.txt
文本中第二行到第四行的數(shù)據(jù)贯钩,命令如下:
[root@localhost tmp]# sed '2,4d' student.txt
ID Name Python Linux MySQL Java
4 Shahs 66 65 64 63.33
2,4
表示刪除2至4行的數(shù)據(jù)募狂。
但是這里要注意的是办素,我上邊的操作,并沒有寫入到文件中祸穷,我們可以查看student.txt
文本中的內(nèi)容:
[root@localhost tmp]# cat student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
可以看到student.txt
文本中的內(nèi)容還在性穿,sed
命令只是在輸出的時候,把數(shù)據(jù)過濾掉了雷滚。
如果需要在刪除內(nèi)容的同時需曾,再寫入文件,就需要-i
選項(xiàng)了祈远。
執(zhí)行命令:
[root@localhost tmp]# sed -i '2,4d' student.txt
就可以了呆万。
(3)向文件中追加數(shù)據(jù)
需求:在student.txt
文本中第三行后面添加66666666666666
執(zhí)行命令如下:
[root@localhost tmp]# sed "3a 66666666666666" student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
66666666666666
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
同理,student.txt
文本中的內(nèi)容并沒有被改變车份,如果需要改變student.txt
文本中的內(nèi)容谋减,添加-i
選項(xiàng)。
注意:sed
命令的選項(xiàng)要寫在單引號(雙引號也可以)之外扫沼,如:
[root@localhost tmp]# sed -i "3a 66666666666666" student.txt