Sed工具工作原理及特性
-
1. sed是流編輯器,每一次讀取一行到內(nèi)存中,即稱之為模式空間(pattern space)
-
2. 默認不修改原文件,如果需要修改需加
-i參數(shù) -
3. sed有模式空間及保持空間(hold sapce),默認打印模式空間中的內(nèi)容到標準輸出
-
4. 默認情況下,模式空間中的內(nèi)容打印一次,被模式匹配到的內(nèi)容被命令動作處理過,一般情況下會再次打印 到標準輸出,除非使用
d選項。 -
5. sed讀取每行的時候會將內(nèi)容保存至內(nèi)存中
-
6. 支持正則和擴展正則表達式,除
-y選項
Sed命令
sed - ed - stream editor for filtering and transforming text
-
synopsis: sed [OPTION]... {script} [input-file]…
常用格式:
sed 選項 地址定界 編輯命令 文件-
[Options]
-
-n: 不輸出模式空間中的內(nèi)容至屏幕,即關(guān)閉不能被模式匹配到的行到標準輸出中 -
-e: 多項編輯一次執(zhí)行 -
-f FILE: FILE中每行是一個操作命令 -
-r: 支持擴展正則表達式 -
-i: 直接保存至原文件中
-
-
地址定界常規(guī)方法
-
1 空地址:即對全文進行處理
sed 's/root/ROOT/' /etc/passwd
-
2 單地址:
- # : 指定行
sed -n '1,5{/^#/p}' fstabsed '1,+5{/^#/d}' fstab
- /pattern/ : 被模式匹配到的每一行
sed '/^root/p' /etc/passwd
- # : 指定行
-
3 地址范圍
- #,# : 從#號行到#號行
-
sed '2,3d' /etc/fstab: 顯示除2到3行的所有行
-
- #,+# : 從#號行向下#行
-
sed '2,+5d' /etc/fstab: 刪除2到5行
-
- #,/pattern/ : 從#號行到被模式匹配到的行
-
sed '1,/^UUID/d' fstab1: 刪除從第1行到被模式匹配到的第一個行的位置,刪除
-
- /pattern1/,/pattern2/ : 從模式1匹配到的行到被模式2匹配到的行
-
sed -n '/^[/]/p' fstab1: 顯示為/開始的行 -
sed '/^#/d' fstab1: 顯示開始為#號的行
-
- $ : 表示最后一行
-
sed '$d' fstab1: 刪除最后一行
-
- #,# : 從#號行到#號行
-
4 步進地址表示法:
- 1~2: 所有奇數(shù)行
sed -n '1~2p' fstab1
- 2~2: 所有偶數(shù)行
sed -n '2~2p' fatab1
- 1~2: 所有奇數(shù)行
-
-
sed編輯命令
-
d: 刪除模式空間中的內(nèi)容- 示例:
-
sed '1,5d' FILE: 刪除1到5行的內(nèi)容 -
sed '1~2d' FILE: 刪除奇數(shù)行,只顯示偶數(shù)行
-
- 示例:
-
p: 顯示被模式框定的內(nèi)容- 示例:
-
sed '1~2p' FILE: 顯示奇數(shù)行,如果只需要顯示一次,需要使用-n關(guān)閉默認模式空間的內(nèi)容 -
sed -n '/./p' a.sh: 顯示非空行,但對制表符無效
-
- 示例:
-
P: 只顯示模式空間中的第一行- 示例:
-
seq 5 | sed -n 'N;P': 顯示結(jié)果為1、3兩行
-
- 示例:
-
a \line: 追加line行至匹配到行的后面,如果是多行可使用\n實現(xiàn)多行追加- 示例:
-
sed '/^UUID/ a\line1\nline2' fstab:查找匹配到UUID開始的行,并在后面添加line1,line2兩行內(nèi)容
-
- 示例:
-
i \line: 添加line行到匹配行的前面,如果是多行可使用\n實現(xiàn)多行添加- 示例:
-
sed '/^UUID/i \line1\nline2' fstab:查找匹配到UUID開始的行,并在其前面增加line1,line2兩行內(nèi)容
-
- 示例:
-
c \line: 把匹配到的行替換為line行- 示例
-
sed '/^UUID/c \newline' fstab1: 匹配以UUID開始的行,并把其替換為newline行
-
- 示例
-
w /PATH: 將模式空間匹配到的行,寫入指定文件中- 示例
-
sed '/#/!w ./w.txt' fstab: 匹配非#開始的行,并寫入當(dāng)前目錄下的w.txt文件中
-
- 示例
-
r /PATH: 將PATH中指定的文件寫入匹配到的行下方,多用于文件合并。- 示例:
-
sed '/^UUID/r ./w.txt' fstab:把當(dāng)前目錄下的w.txt文件寫入到以UUID開頭的行下
-
- 示例:
-
q: 退出sed,一般用于打印到第幾行即退出- 示例:
-
sed '10q' FILE: 只打印文件中的前10行,等同于sed -n '1,10p' FILE
-
- 示例:
-
y: 完成大小寫替換(等同于s///,基本不用)-
sed '1,15y/UUID/uuid/' fstab1:替換1到15行的內(nèi)容UUID為uuid -
sed 'y/UUID/uuid/' fstab1: 替換全文每行中的第一個匹配到的
-
-
=: 匹配到的行,顯示一個行號,默認在其匹配到的行上方顯示對應(yīng)的行號,如果需要只顯示行號,需要加-n參數(shù),把模式空間中的內(nèi)容關(guān)閉顯示。- 示例
-
sed '/^UUID/=' fstab: 在匹配到UUID開頭的行上一行打印其行號 -
sed -n '$=' fstab: 顯示最后一行的行號,一般可用于顯示文本的總行數(shù)。 -
sed '/./=' File: 顯示所有行的行號,但空行不顯示行號
-
- 示例
-
!: 條件取反,一般用于模式之后,命令之前- 示例
-
sed '/^#/!d' FILE: 只顯示非注釋的行
-
- 示例
-
s///: 字符替換查找,其分隔符可自動指定,常用的有,s@@@、s###。- 替換標記操作符
-
g: 全局替換,不加g只能每行開始的第一個匹配操作- 如果只想從第幾次開始替換,可使用
3g即Ng(N代表一個數(shù)值)
- 如果只想從第幾次開始替換,可使用
-
w /PATH: 將替換成功的結(jié)果保存至指定文件中 -
p: 顯示替換成功的行- 示例
-
sed 's/UUID/uuid/' fstab: 將UUID替換為uuid -
sed's/love/& you' FILE: 將love替換為love you,&`表示對前面模式的引用 -
sed 's/^\(UUID\).*/\1 Hello/' fstab1: 將UUID開頭的行替換為UUID Hello的內(nèi)容 -
sed -n '1,15s/^UUID/uuid/gp' fstab: 查找1到15行以UUID開始的行,并將其替換為uuid,并且只顯示被替換過的行 -
sed 's/.$//' File將每行中最后一個字符刪除,.$代表每行的最后一個字符
-
- 示例
-
- 替換標記操作符
-
h: 把模式空間中的內(nèi)容覆蓋至保持空間中 -
H: 把模式空間中的內(nèi)容追加至保持空間中 -
g: 把保持空間中的內(nèi)容覆蓋至模式空間中 -
G: 把保持空間中的內(nèi)容追加至模式空間中 -
x: 把模式空間中的內(nèi)容到保持空間中的內(nèi)容互換,初始保持空間中為空 -
n: 讀取下一行覆蓋模式空間中的行-
seq 11 | sed 'n;d': 顯示結(jié)果為1、3、5、7、9、11 ,默認動作先輸出模式空間中的行,再覆蓋讀取下一行,再執(zhí)行d命令 -
seq 10 | sed 'n;d': 顯示結(jié)果為1、3、5、7、9
-
-
N: 讀取下一行并追加到模式空間中的行后面,使用\n分隔-
seq 11 | sed 'N;d': 顯示結(jié)果為11,默認動作先讀取兩行,然后執(zhí)行d操作 -
seq 10 | sed 'N;d':顯示結(jié)果為空
-
-
D: 刪除模式空間中的多行-
seq 11 | sed 'N;D': 顯示結(jié)果為11
-
-
{}: 多命令同時執(zhí)行時,需要使用{}括起來-
sed -n '/^UUID/{N;p}' fstab1: 讀取UUID開始的行,再讀取下一行并打印模式空間的內(nèi)容。
-
-
應(yīng)用實例
-
替換文本中的字符串
-
echo "sksksksksksk" | sed 's/sk/SK/3g- 結(jié)果:skSKSKSKSKSK
-
-
定界符出現(xiàn)在樣式內(nèi)部時,需要進行轉(zhuǎn)義,建議更換定界符
sed 's/\/bin/\/usr\/local\/bin/g'
-
刪除指定的行
-
sed '2d' file: 刪除第二行 -
# sed '2,$d' file: 刪除第二行到最后一行 -
sed '$d' file: 刪除最后一行 -
sed '/^test/'d file: 刪除文件中以test開頭的行
-
-
正則表達式 \w+ 匹配每一個單詞,使用 [&] 替換它,& 對應(yīng)于之前所匹配到的單詞
-
echo this is a test line | sed 's/\w\+/[&]/g'- 結(jié)果:[this] [is] [a] [test] [line]
-
-
所有以192.168.0.1開頭的行都會被替換成它自已加localhost
-
sed 's/^192.168.0.1/&localhost/' file- 結(jié)果:192.168.0.1localhost
-
-
替換digit 7的內(nèi)容替換為 7
-
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'- this is 7 in a number
-
-
love被標記為1,所有l(wèi)oveable會被替換成lovers,并打印出來
sed -n 's/\(love\)able/\1rs/p' file
-
所有在模板test和check所確定的范圍內(nèi)的行都被打印
sed -n '/test/,/check/p' file
-
對于模板test和west之間的行,每行加上字符串a(chǎn)aa bbb
sed '/test/,/west/s/$/aaa bbb/' file
-
查找line1 到line2之間的所有aa bbb 替換為AA BBB
sed '/line1/,/line2/s/aa bbb/AA BBB/' test.sh
-
使用n;p打印奇數(shù)行和偶數(shù)行
-
sed -n 'p;n' test.txt#奇數(shù)行 -
sed -n 'n;p' test.txt#偶數(shù)行 -
sed -n '1~2p' test.txt#奇數(shù)行 -
sed -n '2~2p' test.txt#偶數(shù)行
-
-
匹配關(guān)鍵字并顯示后幾行
-
sed -n '/3/,$p' a.sh: 顯示第一次匹配到的3,到最后一行輸出 -
sed -n '/3/,+2p' a.sh: 顯示第一次匹配到的3,到向下2行輸出
-
sed高級說明舉例說明
-
seq 4 | sed 'n;d'1 3
說明:pattern space先讀入1,然后執(zhí)行到n,把下一行2讀入pattern space中并覆蓋原本的1。然后pattern space中的內(nèi)容(2)被刪除(d操作),所以打印出1\n3
-
seq 5 | sed 'n;d'1 3 5 -
seq 4 | sed 'N;d'Nothing說明:pattern space先讀入1,然后執(zhí)行到N,把下一行添加到當(dāng)前的pattern space中,pattern space內(nèi)容為1\n2,然后執(zhí)行d操作被刪除。接下去讀入3(系統(tǒng)讀入總是覆蓋原有內(nèi)容),執(zhí)行N,pattern space 內(nèi)容變?yōu)?\n4,然后再被刪除
-
seq 7 | sed ‘N;d’7 -
理解
n與N-
seq 4 | sed –n 'n'Nothing -
`seq 4 | sed –n ‘N’
Nothing
以上兩都不會輸出輸入,
-n參數(shù)把模式空間中的內(nèi)容關(guān)閉顯示了 -
-
`seq 4 | sed –n 'n;p'
2 4說明:
-n參數(shù)不顯示模式空間的內(nèi)容,n讀取下一行并覆蓋模式空間的內(nèi)容,執(zhí)行p操作 -
seq 4 | sed –n 'N;p'1 2 3 4說明:
-n不顯示模式空間中的內(nèi)容,N讀取1\n2行的內(nèi)容,再p命令顯示模式空間中的內(nèi)容 -
seq 5 | sed –n 'N;p1 2 3 4說明:
n首先讀取1\n2 -->打印模式空間 -->讀取3\n4--->打印模式空間--->讀取5行發(fā)現(xiàn)沒有第6行--->失敗 -
seq 5 | sed -n 'n;p'2 4說明:模式空間中有1,然后
n使用2覆蓋1,再p打印,當(dāng)執(zhí)行到第5行時,發(fā)現(xiàn)沒有下一行了,就不執(zhí)行n了 -
理解
x-
seq 11 | sed -n 'x;p'==seq 11 | sed 'x'[sapce line] 1 2 3 4 5 6 7 8 9 10
說明:模式空間的1<--->保持空間的空白行-->打印模式空間的空行,11并沒有打印出來,因為他在保持空間中
-
seq 4 | sed '/3/{x;p;x}'
1
23 4
說明:當(dāng)匹配到3的時候,執(zhí)行交換,現(xiàn)在模式空間為空行,保持空間中為3,執(zhí)行p命令顯示模式空間中的空行,
x再交換兩這空間的內(nèi)容,此是模式空間為3,默認模式空間的就會輸出至標準屏幕,故3之前多了一個空行-
seq 4 | sed '/3/{x;p;x;d}'1 2 4
說明:當(dāng)?shù)诙€x交換回來,直接交給d執(zhí)行,故3就沒有了,只多了一條空行
-
-
理解
h和H-
seq 4 | sed 'h;x'1 2 3 4
說明:把模式空間中的內(nèi)容覆蓋到保持空間,再交換,再打印至標準輸出
-
seq 4 | sed 'x;h'Nothing
說明:先把模式空間的與保持空間交換,現(xiàn)在模式空間為空行,保持空間為1,然后再把模式空間覆蓋保持空間,再輸出至標準輸出,故都為空行
-
-
理解
G和g-
seq 4 | sed '/3/g'1 2 4
說明:當(dāng)匹配到3的時候,把保持空間的空行覆蓋到模式空間,故就輸出了空行
-
-
seq 3 | sed '1!;G'1 2 NULL 3 NULL
說明: 不是第1行就執(zhí)行G操作,G是追加保持空間到模式空間,即為2+空行
-
seq 3 | sed '1!G;h;$!d'3
2
1
說明:當(dāng)讀到第一行時G不操作,然后把模式空間的內(nèi)容覆蓋到保持空間,然后刪除模式空間,此時,保持空間為1,當(dāng)讀到第二行時,把保持空間的內(nèi)容追加到模式空間,此時模式空間為2\n1,再執(zhí)行h,把模式空間中的內(nèi)容再覆蓋到保持空間,此時保持空間為2\n1,刪除模式空間,讀取第3行時,把保持空間的內(nèi)容追加到模式空間中,此時模式空間的為3\n\2\n1,最后一行不執(zhí)行d操作
-
實例
sed -n ’n;p’ file: 顯示偶數(shù)行ed ‘1!G;h;$!d’:逆序顯示內(nèi)容sed ‘$!d’ file:不是最后一行刪除,取出最后一行sed ‘$!N;$!D’: 取出文件后兩行sed ‘/^$/d;G’ FILE: 刪除原有的所有空白行,而后為所有的非空白行后添加一個空白行sed ’n;d’ FILE:顯示奇數(shù)行sed ‘G’ /etc/issue: 在原有的每行后方添加一個空白行
本文借用網(wǎng)絡(luò)上的文檔編輯而成,感謝原作者,如造成影響請通知將其刪除,此文用于學(xué)習(xí)sed工具的使用,網(wǎng)絡(luò)地址如下:
http://www.1987.name/306.html; http://bbs.chinaunix.net/thread-3763371-1-1.html