1. 程式人生 > >sed命令簡介

sed命令簡介

bash編程 shell sed

文本處理三劍客:
    grep:egeep,fgrep:文本過濾器
    sed:stream Editor:流編輯器,逐行
    awk:文本格式化工具,報告生成器


一、sed簡介

sed一次從文件中讀取一行,不會修改原文件的內容
sed命令將當前處理的行讀入模式空間(pattern space)進行處理,sed在該行上執行完所有命令後就將處理好的行打印到屏幕上(除非之前的命令刪除了該行)
sed處理完一行就將其從模式空間中刪除,然後將下一行讀入模式空間,進行處理、顯示。
處理完文件的最後一行,sed便結束運行。sed在臨時緩沖區(模式空間)對文件進行處理,所以不會修改原文件,除非顯示指明-i選項。


放在sed的工作空間:pattern space 處理-->模式匹配-->匹配(則編輯->根據編輯命令是否輸出) //不匹配(stout)
輸出到-->stout

可以基於正則表達式進行文本過濾
把文件的
文件行數據流:--->|pattern space| //默認顯示沒有匹配到的行
v
/ \
No Yes
| / \
| / edit
| / |
V/ Hold space
stdout

//sed空間:空間可以轉換
pattern space
hold space //處理的結果
sed [option] ... ‘script‘ [input-file]... //輸入文件可以有多個
script:地址定界+編輯命令
OPtions:
-n ,--quiet,--slient不輸出模式空間的內容到屏幕
suppress:壓制,不讓
-e script, --expression=script //默認只有一個script,實現多點編輯
-f script-file //腳本文件,每行一個編輯命令
-r 支持擴展的正則表達式
-i 直接編輯原文件
地址定界:
1.空地址,表示對全文進行處理
2.單地址,
# :指定行
/pattern/ :被此模式匹配到的每一行
3.地址範圍
#,# //起始地址
#,+# //向後幾行
#,/pattern/ //到pattern模式匹配結束
/pat1/,/pat2/ //斜線是默認的,必須有
4.步進:~
1~2 //所有的奇數行
2~2 //所有的偶數行
編輯命令:
d 刪除模式空間的內容
sed ‘/^UUID/d‘ /etc/fstab //刪除uuid開頭的行
sed ‘3d‘ /etc/fstab //刪除第3行
sed ‘1~2d‘ /etc/fstab //顯示偶數行,刪除奇數行
p 打印模式空間的內容
sed ‘1~2p‘ /etc/fstab //模式空間顯示兩遍,
//偶數行沒有被匹配,因此顯示
//奇數行被匹配到,默認為顯示
//edit後的操作是顯示
sed ‘1~2p‘ /etc/fstab -n //只顯示奇數行,模式空間的內容
a\test 追加 :在模式匹配到的行,下一行追加文本,支持使用,\n實現多行追加
後面追加
i\test:在行前面插入文本,支持使用\n實現多行插入
sed ‘3i \new line‘ fstab.t //不匹配到的行,默認也為輸出
sed ‘3a \new line\nanother line‘ fstab.t //插入兩行
sed ‘/UUID/a \# add new device base on UUID‘ fstab.t //在每一行的UUID前面都加了信息
c\text:把匹配到的行替換為此處指定的文本"text";

主要: "/" 和 "\" 都可以使用

w /PATH/TO/SOMEWHERE :保存模式空間匹配到的行至指定的文件中
sed -n ‘/^[^#]/w /tmp/fsatb.test‘ fstab //把非#開頭的行,保存到文件
r /PATH/TO/SOMEFILE :讀取指定文件的內容到當前文件被模式匹配到的行中
sed ‘3r /etc/issue‘ fstab //在3行,讀入issue的內容
sed ‘/dev/r /etc/issue‘ fstab //匹配到的行,都讀入issue文件內容
= 為模式空間匹配到的行,打印行號
sed ‘/dev/=‘ fstab
! 條件取反
sed ‘/^#/!d‘ /etc/fstab //模式取反
s/// :查找替換,其分隔符可自行指定,常用的分隔符,s##,s@@,s///等
替換標記:
g:全局替換
w /PATH/TO/SOMEFILE:保存到指定文件
p:顯示替換成功的行

二、練習
1.刪除/boot/grub/grub2.cfg文件中所有以空白開頭的行的行首的所有空白字符
2.刪除/etc/fstab文件中所有以#開頭的行的行首的#號以及#號後面的空白字符
3.輸出一個絕對路徑,取出其目錄,其行為類似於dirname
1.sed ‘s@^[[:space:]]\+@@‘ /etc/grub2.cfg
2.sed ‘s@^#[[:space:]]*@@‘ /etc/fstab
sed ‘s@^#[[:space:]]*@@‘ -e ‘/^UUID/d‘ /etc/fstab
3.echo "/var/log/messages" | sed ‘s@[^/]\+$@@‘
echo "/var/log/messages/" | sed ‘s@[^/]\+/\?$@@‘ //基本的正則表達式,\?需要轉義:可有可無
echo "/var/log/messages/" | sed -r ‘s@[^/]+/?$@@‘ //擴展的正則表達式

三、高級編輯命令
h H Copy/append pattern space to hold space. p->h
g G Copy/append hold space to pattern space. h->p
g:get
大寫的為追加,小寫的為復制
x:把兩組空間互換,exchange
n N Read/append the next line of input into the pattern space.
d 刪除模式空間中的行
D:刪除多行模式空間中的行

示例:
sed -n ‘n;p‘ /etc/fstab //顯示偶數行,n為下一行,分號用於分割命令
sed ‘1!G‘ /etc/fstab //除了第一行,都追加一行空白
sed ‘1!G;h;$!d‘ /etc/fstab
//覆蓋模式空間到hold空間,最後一行不刪除,其他都刪除{刪除模式空間的第幾行}
//逆序顯示文件內容
sed ‘$!d‘ /etc/fstab //不是最後一行就刪除
sed ‘$!N;$!D’ file //只顯示最後兩行
$!N //不是最後一行,追加下一行到模式空間
倒數第二行,追加最後一行後結束
$!D //不是最後一行,都刪除,
倒數第二行的時候,追加的是最後一行,所以不刪除
sed ‘/^$/d;G‘ /etc/fstab //刪除原有的所有空白行,而後為所有的非空白行,後添加一個空白行
sed ‘n;d‘ file //顯示奇數行
sed ‘G‘ file //在每行後都追加一個空白行
sed -i ‘/^UUID/d‘ fstab //在原有的文件上修改

註意:任何時候,刪除和修改的時候,先備份



本文出自 “黑馬騰空” 博客,請務必保留此出處http://hmtk520.blog.51cto.com/12595610/1950194

sed命令簡介