文本三劍客:都是按行讀取后處理。
grep 過濾行內(nèi)容
awk 過濾字段
sed 過濾行內(nèi)容;修改行內(nèi)容
sed編輯器
sed是一種流編輯器,流編輯器會在編輯器處理數(shù)據(jù)之前基于預(yù)先提供的一組規(guī)則來編輯數(shù)據(jù)流
sed編輯器可以根據(jù)命令來處理數(shù)據(jù)流中的數(shù)據(jù),這些命令要么從命令行中輸入,要么存儲在一個命令文本文件中
sed主要用來自動編輯一個或多個文件;簡化對文件的反復(fù)操作;編寫轉(zhuǎn)換程序等
sed編輯器的工作流程
sed 的工作流程主要包括讀取、執(zhí)行和顯示三個過程:
讀取: sed從輸入流(文件、管道、標(biāo)準(zhǔn)輸入)中讀取一行內(nèi)容并存儲到臨時的緩沖區(qū)中(又稱模式空間,pattern space )。
執(zhí)行:默認(rèn)情況下,所有的sed 命令都在模式空間中順序地執(zhí)行, 除非指定了行的地址,否則sed命令將會在所有的行上依次執(zhí)行。
顯示:發(fā)送修改后的內(nèi)容到輸出流(屏幕)。在發(fā)送數(shù)據(jù)后,模式空間將會被清空。在所有的文件內(nèi)容都被處理完成之前,上.述過程將重復(fù)執(zhí)行,直至所有內(nèi)容被處理完。
在所有的文件內(nèi)容都被處理完成之前,上述過程將重復(fù)執(zhí)行,直至所有內(nèi)容被處理完。
注意:默認(rèn)情況下所有的sed命令都是在模式空間內(nèi)執(zhí)行的,因此輸入的文件并不會發(fā)生任何變化,
除非是用重定向存儲輸出或者sed -i.
sed命令格式
sed -e '操作' 文件1 文件2..
sed -n -e '操作1;操作2' 文件1 文件2 ..
sed -f 腳本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
sed -e 'n {
操作1
操作2
}' 文件1 文件2 ...
常用選項
選項 | 作用 |
-e 或--expression= | 表示用指定命令來處理輸入的文本文件,只有一個操作命令時可省略,一般在執(zhí)行多個操作命令使用 |
-f 或--file= | 表示用指定的腳本文件來處理輸入的文本文件 |
-h或--help | 顯示幫助 |
-n、--quiet或silent | 禁止sed編輯器輸出,但可以與p命令一起使用完成輸出 |
-r | sed 的動作支持的是延伸型正規(guī)表示法的語法。(默認(rèn)是基礎(chǔ)正規(guī)表示法語法) |
-i | 直接修改目標(biāo)文本文件 |
常用操作
操作 | 作用 |
s | 替換,替換指定字符 |
d | 刪除,刪除選定的行 |
a | 增加,在當(dāng)前行下面增加一行指定內(nèi)容 |
i | 插入,在選定行上面插入一行指定內(nèi)容 |
c | 替換,將選定行替換為指定內(nèi)容 |
y | 字符轉(zhuǎn)換,轉(zhuǎn)換前后的字符長度必須相同 |
p | 打印,如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內(nèi)容;如果有非打印字符,則以ASCII碼輸出。其通常與"-n"選項一起使用。 |
= | 打印行號 |
l(小寫l) | 打印數(shù)據(jù)流中的文本和不可打印的ASCII字符(比如結(jié)束符$、制表符\t) |
sed -p? 打印
?sed -n:禁止sed編輯器輸出
?操作‘=’:打印行號
?操作 ‘l’:打印數(shù)據(jù)流中的文本和不可打印的ASCII字符
?sed -e 多個操作
sed -n -e '命令1' -e '命令2' 文件
或者
sed -n -e '命令1;命令2' 文件
或者
sed -n '
命令1
命令2
....
' 文件
?也可以合并
?或者使用換行打印文件內(nèi)容
?sed對指定行進(jìn)行操作
以數(shù)字形式表示行區(qū)間
用文本模式(字符串)來過濾出行(一般結(jié)合正則表達(dá)式)以數(shù)字形式表示行區(qū)間
操作 | 含義 |
---|---|
'1p' | 打印第一行 |
'$p' | 打印最后一行 |
'1,3p' | 打印連續(xù)行,打印第一行到第三行 |
'6,$p' | 打印第六行到最后一行 |
'1,+3p' | 打印第一行加后面三行(即打印第一到第四行) |
'5q' | 打印前五行后退出 |
'p;n' | 打印奇數(shù)行 |
'n;p' | 打印偶數(shù)行 |
使用字符串匹配出行:
操作 | 含義 |
'/root/p' | 打印包含root的行 |
'/root/!p' | 打印不包含root的行。! 表示取反 |
'/^root/p' | 打印以root開頭的行 |
'/bash$/' | 打印以bash結(jié)尾的行 |
'/root l bash/p' | 打印包含root或bash的行。"l"是擴(kuò)展正則表達(dá)式的元字符,要使用sed -r |
'6,/root/p' | 打印第6行到第一個包含root的行 |
?以數(shù)字形式表示行區(qū)間
打印單行
?打印連續(xù)的行
?打印第一行和后面3行 (1-4)
?打印第1-5行的方法
?還有一種也能算是
?使用sed輸出奇數(shù)行或者偶數(shù)行
?打印除了第一行以外的奇數(shù)行
?使用正則表達(dá)式,匹配行內(nèi)容
注意:sed 使用擴(kuò)展正則表達(dá)式時,要加 -r?
?sed -r 支持?jǐn)U展正則表達(dá)式,同時在 使用{n}、{n,}、{n,m}時,括號{}前不需要加反斜杠\
刪除指定行
sed 'd'
?sed '/#/,/@/d' 文件名
sed會讀取每行的內(nèi)容,從第一個位置#打開刪除功能,到第二位置@刪完后關(guān)閉刪除功能,再繼續(xù)查詢與? #和@匹配的行 進(jìn)行刪除 一直重復(fù)此操作
?替換
字符串
行范圍 s/舊字符串/新字符串/替換標(biāo)記
替換標(biāo)記
替換標(biāo)記 | 作用 |
數(shù)字 | 表明新字符串將替換第幾處匹配的地方 |
g | 表明新字符串將會替換所有匹配的地方 |
p | 打印與替換命令匹配的行,與-n一起使用 |
w文件 | 將替換的結(jié)果寫到文件中 |
sed -g
sed -s
?替換命令的分隔符看?s后面跟的字符,3個分隔符要保持一致,如果遇到跟分隔符相同的字符則需要使用"\"來轉(zhuǎn)義
將/bin/bash 轉(zhuǎn)換為 /sbin/nologin
因?yàn)樘鎿Q的格式為?s/舊/新? 此處的"/"為分隔符?但是/bin/bash與/sbin/nologin中的"/"為根,容易引起歧義
可以使用"\"轉(zhuǎn)義字符將"/"轉(zhuǎn)義為普通字符
?或者使用其他字符作為分隔符,且所有分隔符保持一致(s后面的內(nèi)容就是分隔符)
?注釋行內(nèi)容
將root開頭的行進(jìn)行注釋(在開頭加上#)
在包含root的行的行尾加上#
?
?刪除
?整行替換
使用c進(jìn)行替換,是對整行內(nèi)容進(jìn)行替換
sed '#c 新內(nèi)容 文件名 #替換第#行的全部內(nèi)容
或者
sed '/舊內(nèi)容/c 新內(nèi)容' 文件名 #將被篩選到(含有舊內(nèi)容)的行替換為新內(nèi)容
?單字符替換 y
使用y,是對單個字符進(jìn)行替換,每個字符需要一一對應(yīng),不是整體替換,前后字符串長度需要一致,不然會報錯
?增加(插入)內(nèi)容
行前插入
?在行后插入內(nèi)容
?插入文件內(nèi)容
?剪切粘貼
?調(diào)換順序
文章來源:http://www.zghlxwxcb.cn/news/detail-418056.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-418056.html
到了這里,關(guān)于DAY 35 sed文本編輯器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!