鍍金池/ 教程/ Linux/ shell 學習十三天---sed 案例分析
shell 學習四十五天---xargs
shell學習第三天
shell 學習十五天---join 連接字段
shell 學習第二天
shell 學習四十三天---臨時性文件的建立與使用
shell 學習第六天---小結(jié)
shell 學習三十三天---關(guān)于重定向
shell 學習二十九天---循環(huán)
shell 學習二十四天---提取開頭或結(jié)尾數(shù)行
shell 學習第十天---sed 查找與替換
shell 學習第十一天---sed 正則的精確控制
shell 學習三十天---break,continue,shift,getopts
shell 學習---小結(jié)
shell 學習三十一天---函數(shù)問題
shell 學習第四天---華麗的 printf 輸出
shell 學習三十五天---波浪號展開與通配符
shell 學習十九天---文本塊排序
shell 學習十二天---行與字符串
shell 學習二十一天---重新格式化段落
shell 學習十八天---文本排序
shell 學習十三天---sed 案例分析
shell 學習四十一天---列出文件 ls 和 od 命令
shell 學習十七天---awk 命令
shell 學習三十六天---命令替換
shell 學習十六天---join 練習
shell 學習三十二天---read 讀取一行
shell 學習二十二天---計算行數(shù),字數(shù)以及字符數(shù)
shell 學習小總結(jié)---本章小結(jié)
shell 學習第八天---擴展正則表達式(ERE)
shell 學習四十二天---使用 touch 更新文件時間
shell 學習二十八天---case 語句
shell 學習三十九天---內(nèi)建命令
shell 學習第一天
shell 學習三十四天---printf 詳解
shell 學習二十六天---變量與算數(shù)
shell 學習三十八天---執(zhí)行順序和 eval
shell 學習四十四天---尋找文件
shell 學習二十五天---神器的管道符
shell 學習十四天---使用 cut 選定字段
shell 學習第五天---基本的I/O重定向
shell 學習四十天---awk 的驚人表現(xiàn)
shell 學習二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學習二十三天---打印
shell 學習第九天---分組
shell 學習四十八天---文件校驗和匹配
shell 學習二十七天---退出狀態(tài)和 if 語句
shell 學習四十七天---文件比較 cmp,diff,patch
shell 學習第七天---基礎(chǔ)正則表達式(BRE)
shell 學習四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學習三十七天---引用
shell 學習小結(jié)

shell 學習十三天---sed 案例分析

sed 的使用案例

使用 sed 操作/etc/passwd,最好復制一份(cp /etc/passwd /tmp),操作 tmp 下的 passwd(其實不用,因為在一般情況下 sed 只是修改了輸出結(jié)果,不會改變文件本身,除非要求這么做).

以行為單位的新增/刪除
要求:將/etc/passwd 的內(nèi)容列出并且列印行號,同時刪除 2~5 行.
做法:cat /etc/passwd | sed ‘2,5d’
sed 的動作是’2,5d’(動作需要放在單引號之間)
nl 命令在 linux 系統(tǒng)中用來計算文件中行號。nl 可以將輸出的文件內(nèi)容自動的加上行號!其默認的結(jié)果與 cat -n 有點不太一樣, nl 可以將行號做比較多的顯示設(shè)計,包括位數(shù)與是否自動補齊 0 等等的功能。
只刪除第二行:
nl /etc/passwd | sed ‘2d’

刪除第3行到最后一行
cat -n /etc/passwd | sed ‘3,$d’

在第二行后(就是在第三行)加上”i am fine”字樣
cat -n /etc/passwd | sed ‘2a i am fine’

如果要在第二行前面
nl /etc/passwd | sed ‘2i i am fine’

如果是要增加兩行以上,在第二行后面加入兩行字,例如『hello』與『how are you』
nl /etc/passwd | sed ‘2a hello\
>how are you’
每一行之間都必須要以反斜杠()來進行新行的添加,所以上面的例子,我們可以發(fā)現(xiàn)在第一行的最后面就有 \ 存在。
(再輸入的是會需要注意,單引號不要一起輸完).

以行為單位的替換與現(xiàn)實
將第 2-5 行的內(nèi)容替換成”hahaha”
nl /etc/passwd | sed ‘2,5c hahaha’
通過這個方法,我們就可以替換整行數(shù)據(jù)了.

僅列出/etc/passwd 文件的 5-7 行
cat -n /etc/passwd | sed -n ‘5,7p’
可以透過這個 sed 的以行為單位的顯示功能, 就能夠?qū)⒛骋粋€文件內(nèi)的某些行號選擇出來顯示。

數(shù)據(jù)的搜尋與顯示

搜索/etc/passwd 中有關(guān)/root 關(guān)鍵字的行
nl /etc/passwd | sed ‘/root/p’
思考:為什么會輸出所有行的情況?
使用-n 的時候?qū)⒅淮蛴“0宓男小?br /> nl /etc/passwd | sed -n ‘/root/p’

數(shù)據(jù)的搜索與刪除
刪除/etc/passwd 所有包含 root 的行,其他行輸出
nl /etc/passwd | sed ‘/root/d’

數(shù)據(jù)的搜索并執(zhí)行命令
搜索/etc/passwd,找到 root 對應(yīng)的行,執(zhí)行后面花括號中的一組命令,每個命令之間用分號分隔,這里把 bash 替換為 blueshell,再輸出這行:
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
如果只替換/etc/passwd 的第一個 bash 關(guān)鍵字為 blueshell,就退出
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' 1
最后的 q 是退出。

數(shù)據(jù)的搜索并替換
除了整行的處理模式之外,sed 還可以用行為單位進行部分數(shù)據(jù)的搜尋并替換.基本上 sed 的搜尋與替換與 vi 相當?shù)念愃?
sed ‘s/要被取代的字符串/新的字符串/g’

先通過/sbin/ifconfig eth0 查看本機的 IP 地址,我的是(192.168.199.5)
將 IP 前面部分予以刪除
/sbin/ifconfig eth0 | grep 'inet addr'|sed 's/^.*addr://g'
將 IP 后面部分予以刪除
/sbin/ifconfig eth0 | grep 'inet addr'|sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
即可得到 IP

多點編輯

一條 sed 命令,刪除/etc/passwd 第三行到末尾的數(shù)據(jù),并把 bash 替換成 hahaha.
nl /etc/passwd | sed -e ‘3,$d’ -e ‘s/bash/hahaha/g’
注意:每天命令前面都加入了-e 選項

直接修改文件內(nèi)容
最好別使用,如果使用需要加入一個-i 選項
例如在最后一行插入 hahaha
nl /etc/passwd | sed -i ‘$i hahaha’