Linux Shell編程 sed命令
概述
sed命令用來選取、替換、刪除、新増數據
sed 是一種幾乎可以應用在所有 UNIX 平臺(包括 Linux)上的輕量級流編輯器。sed 有許多很好的特性。首先,它相當小巧,通常要比你所喜愛的腳本語言小多倍。其次,因為 sed 是一種流編輯器,所以,它可以對從如管道這樣的標準輸入中接收的數據進行編輯。因此,無須將要編輯的數據存儲在磁盤上的文件中。因為可以輕易將數據管道輸出到 sed,所以,將 sed 用作強大的 Shell 腳本中長而復雜的管道很容易。
sed 主要是用來將數據進行選取、替換、刪除、新増的命令。我們看看命令的語法:
[root@localhost ~] # sed [選項] ‘[動作]‘ 文件名
選項:
- -n:一般 sed 命令會把所有數據都輸出到屏幕上。如果加入此選項,則只會把經過 sed 命令處理的行輸出到屏幕上;
- -e: 允許對輸入數據應用多條 sed 命令編輯;
- -f 腳本文件名:從 sed 腳本中讀入 sed 操作。和 awk 命令的 -f 選項非常類似;
- -r:在 sed 中支持擴展正則表達式;
- -i:用 sed 的修改結果直接修改讀取數據的文件,而不是由屏幕輸出動作;
- a \:追加,在當前行後添加一行或多行。當添加多行時,除最後一行外,每行末尾需要用“\”代表數據未完結;
- c \:行替換,用c後面的字符串替換原數據行。當替換多行時,除最後一行外,每行末尾需用“\”代表數據未完結;
- i \:插入,在當前行前插入一行或多行。當插入多行時,除最後一行外,每行末尾需要用“\”代表數據未完結;
- d:刪除,刪除指定的行;
- p:打印,輸出指定的行;
- s:字符串替換,用一個字符串替換另一個字符串。格式為“行範圍s/舊字串/新字串/g”(和Vim中的替換格式類似);
大家需要註意,sed 所做的修改並不會直接改變文件的內容(如果是用管道符接收的命令的輸出,則連文件都沒有),而是把修改結果只顯示到屏幕上,除非使用"-i"選項才會直接修改文件。
sed命令示例
sed行數據操作示例
利用"p"動作查看student.txt 文件的第二行 。
[root@localhost ~]# sed ‘2p‘ student.txt ID Name PHP Linux MySQL Average 1 Liming 82 95 86 87.66 1 Liming 82 95 86 87.66 2 Sc 74 96 87 85.66 3 Gao 99 83 93 91.66
"p"動作輸出了第二行數據,但是 sed 命令還會把所有數據都輸出一次。如果只想輸出指定某行數據,則需要添加"-n"選項。
[root@localhost ~]# sed -n ‘2p‘ student.txt 1 Liming 82 95 86 87.66
刪除從第二行到第四行的數據,文件本身並沒有被修改
[root@localhost ~]#sed ‘2,4d‘ student.txt ID Name PHP Linux MySQL Average [root@localhost ~]# cat student.txt ID Name PHP Linux MySQL Average 1 Liming 82 95 86 87.66 2 Sc 74 96 87 85.66 3 Gao 99 83 93 91.66
sed命令中所有的動作必須使用"單引號"包含;在動作中可以使用數字代表行號,逗號代表連續的行範圍。使用"$"代表最後一行,如果動作是"2,$d",則代表從第二行刪除到最後一行。
在第二行後加入hello
[root@localhost ~]# sed ‘2a hello‘ student.txt ID Name PHP Linux MySQL Average 1 Liming 82 95 86 87.66 hello 2 Sc 74 96 87 85.66 3 Gao 99 83 93 91.66
"a"動作會在指定行後追加數據。如果想要在指定行前插入數據,則需要使用"i"動作。
在第二行前插入兩行數據
[root@localhost ~]# sed ‘2i hello > world‘ student.txt ID Name PHP Linux MySQL Average hello world 1 Liming 82 95 86 87.66 2 Sc 74 96 87 85.66 3 Gao 99 83 93 91.66
如果想追加或插入多行數據,則除最後一行外,每行的末尾都要加入"\"代表數據未完結。
使用"-n"選項只查看sed命令操作的數據
[root@localhost ~]# sed -n‘2i hello world‘ student.txt hello world
實現行數據替換
[root@localhost ~]# cat student.txt | sed ‘2c No such person‘ ID Name PHP Linux MySQL Average No such person 2 Sc 74 96 87 85.66 3 Gao 99 83 93 91.66
sed 命令在默認情況是不會修改文件內容的。如果我確定需要讓 sed 命令直接處理文件的內容,則可以使用"-i"選項。可以使用這樣的命令:
[root@localhost ~]# sed -i‘2c No such person‘ student.txt
sed命令的字符串替換示例
"c"動作是進行整行替換的,如果僅僅想替換行中的部分數據,就要使用"s"動作了。"s"動作的格式如下:
[root@localhost ~]# sed‘s/舊字符串/新字符串/g‘ 文件名
在第三行中,把74換成99
[root@localhost ~]# sed ‘3s/74/99/g‘ student.txt ID Name PHP Linux MySQL Average 1 Liming 82 95 86 87.66 2 Sc 99 96 87 85.66 3 Gao 99 83 93 91.66
如果想把某行的成績註釋掉,讓它不再生效,則可以這樣做:
[root@localhost ~]#sed ‘4s/^/#/g‘ student.txt ID Name PHP Linux MySQL Average 1 Liming 82 95 86 87.66 2 Sc 74 96 87 85.66 #3 Gao 99 83 93 91.66
在這裏使用正則表達式,"^"代表行首
不僅如此,我們還可以同時把"Liming"和"Gao"替換為空
[root@localhost ~]# sed -e ‘s/Liming//g; s/Gao//g‘ student.txt ID Name PHP Linux MySQL Average 1 82 95 86 87.66 2 Sc 74 96 87 85.66 3 99 83 93 91.66
"-e"選項可以同時執行多個 sed 動作,當然,如果只執行一個動作,則也可以使用"-e"選項,但是這時沒有什麽意義。還要註意,多個動作之間要用";"或回車分隔,例如,上一條命令也可以這樣寫:
[root@localhost ~]# sed -e ‘s/Liming//g > s/Gao//g‘ student.txt ID Name PHP Linux MySQL Average 1 82 95 86 87.66 2 Sc 74 96 87 85.66 3 99 83 93 91.66
Linux Shell編程 sed命令