<code>文本處理三劍客:</code>
<code> </code><code>grep:egeep,fgrep:文本過濾器</code>
<code> </code><code>sed:stream Editor:流編輯器,逐行</code>
<code> </code><code>awk:文本格式化工具,報告生成器</code>
一、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 //在原有的檔案上修改
注意:任何時候,删除和修改的時候,先備份
本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1950194,如需轉載請自行聯系原作者