Sed文本處理工具
一、認識sed工具:
sed是一種流編輯器,一次處理一行內容。當進行處理時,把當前處理的行存儲在臨時的緩沖區中(俗稱“模式空間”)后,再用sed命令去處理緩沖區的內容,最后把處理過的緩沖區內容送往屏幕打印顯示。接著處理下一行,不斷重復進行讀取、處理、輸出,直到文件末尾。
注:sed命令處理文本,文件內容本身并沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
二、使用man幫助了解sed的使用格式和常用的選項(#man sed):
NAME(sed的介紹)
sed – stream editor for filtering and transforming text
SYNOPSIS(sed的格式使用)
sed [OPTION]… {script-only-if-no-other-script} [input-file]…
注:“script”為‘地址命令’
DESCRIPTION(sed的常用選項,如下挑選的選項使用上比較多,其他選項請查閱man幫助)
-n, –quiet, –silent 靜默模式,不將模式空間內容輸送到屏幕上打印。
suppress automatic printing of pattern space
-e script, –expression=script 多點編輯。
add the script to the commands to be executed
-f script-file, –file=script-file 從指定的文件中讀取已經編輯好的腳本。
add the contents of script-file to the commands to be executed
–follow-symlinks
follow symlinks when processing in place
-i[SUFFIX], –in-place[=SUFFIX] 在原文本處編輯(此處選項不建議使用,如果實在是要在原處編輯,請做好數據備份后再操作,以免數據的丟失。)
edit files in place (makes backup if SUFFIX supplied)
-r, –regexp-extended 支持擴展正則表達式的使用。
use extended regular expressions in the script.
三、了解sed的簡單編輯命令以及高級編輯命令:
1、 簡單編輯命令:
d: 刪除模式空間匹配的行
p: 顯示模式空間中的內容
a \text:在行后面追加文本;支持使用\n實現多行追加
i \text:在行前面插入文本;支持使用\n實現多行插入
c \text:替換行為單行或多行文本
w /path/to/somefile :保存模式匹配的行至指定文件
r /path/from/somefile:讀取指定文件的文本至模式空間中匹配到的行后
= :為模式空間中的行打印行號
! :模式空間中匹配行取反處理
2、 高級編輯命令:
高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
四、上面了解到sed是文本行處理的流編輯器,那么sed是如何定位要修改的內容呢?那么下面一起來學習sed的地址定界和查找替換:
1、地址定界:
(1) 不給地址:對全文進行處理。
(2) 單地址:
#: 指定的行
/pattern/:被此處模式所能夠匹配到的每一行(模式空間)。
(3) 地址范圍:
#,# 指定從第幾行開始到第幾行結束進行處理。
#,+# 指定從第幾行開始,往后需要處理多少行。
/pat1/,/pat2/ 模式空間定界。指定從第一個被模式空間匹配到開始,直至到被第二個模式空間匹配到結束來進行處理。
#,/pat1/ 指定行與模式空間的配合使用;指定從第幾行開始,到被模式空間匹配到的行進行處理。
(4) ~:步進
1~2 奇數行 只處理文本內容中的奇數行
2~2 偶數行 只處理文本內容中的偶數行
如下圖:分別將文本內容中的奇數行或者偶數行刪除掉
2、查找與替換:
s///:查找替換,支持使用其它分隔符,如:s@@@,s###
替換標記:
g: 是行內全局替換
p: 將顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
學習了上面的理論講述,下面進行相應的事例演示:
1、簡單編輯命令的使用:
sed ‘2p’ /etc/passwd 打印文本內容中的第二行并把文本的原內容一起輸送到屏幕顯示,可結合靜默模式的選項-n配合使用(如下一事例題)
sed -n ‘2p’ /etc/passwd
sed -n ‘1,4p’ /etc/passwd 在屏幕上打印顯示文本內容中的第一行到第四行的內容。
sed -n ‘/root/p’ /etc/passwd 只打印顯示被模式空間匹配到的行
sed -n ‘2,/root/p’ /etc/passwd 從2行開始,到被模式空間匹配到之間的所有行
sed -n ‘/^$/=’ /testdir/issue 顯示空行行號(如下圖,原文本中第三行為空行)
sed -n -e ‘/^$/p’ –e ‘/^$/=’ /testdir/issue 打印空行的行號和空行;多點編輯
sed ‘/root/a\superman’ /etc/passwd 在被模式空間匹配到的行后新增一行打印Superman
sed ‘/root/i\superman’ /etc/passwd 在被模式空間匹配到的行前新增一行打印Superman
sed ‘/root/c\superman’ /etc/passwd 將被模式空間匹配到的行全部替換成了Superman
sed ‘/^$/d’ /testdir/issue 將文本中的空行全部刪除掉
sed ‘1,10d’ /testdir/passwd 將文本中的前十行刪除掉,只打印顯示剩余的行
nl /etc/passwd| sed‘2,5d’ 給文本加以顯示行號,并刪除第二行到第五行的內容
nl/ etc/passwd| sed‘2a tea’ 給文本加以顯示行號,并給第二行后新增一行插入單詞tea
sed 's/nologin/csh/g' /testdir/passwd 在文本中全局查找nologin,并將其替換成csh
sed -n‘s/root/&superman/p’ /etc/passwd在被模式空間匹配到的單詞后面增加Superman
sed -n‘s/root/superman&/p’ /etc/passwd 在被模式空間匹配到的單詞前面增加Superman
2、高級編輯命令的使用:
sed -n 'n;p' /testdir/ff 打印偶數行
sed '1!G;h;$!d' /testdir/ff 逆序顯示
sed '$!N;$!D' /testdir/ff 打印最后兩行
sed '$!d' /testdir/ff 打印最后一行
sed ‘G’ /testdir/ff 打印所有的行,并在每一行的后面增加一個空行
# sed 'g' /testdir/ff 打印空白行
sed -n '1!G;h;$p' /testdir/ff 同樣是逆序打印
# sed '/^$/d;G' /testdir/ff
原創文章,作者:Aaron_wang,如若轉載,請注明出處:http://www.www58058.com/32037
架構清晰,思路清晰,有理論有時間。排版需要改進,對小標題或二級標題可以適當的進行一些字體上的調整。