s-sed(stream editor) 文本填充和编辑 基本使用
文章目錄
- 前言
- 語法格式
- sed 操作地址
- sed子命令
- sed正則表達式
- sed使用實例
- 打印命令 p
- 刪除命令 d
- 替換命令 s
- 指定操作地址的范圍 逗號 ,
- 多重編輯命令 e
- 下行插入命令 a
- 上行插入命令 i
- 修改命令 c
- 獲取下一行命令 n
- 轉換命令 y
- 退出命令 q
- 總結
前言
sed是一個“非交互”式的字符流編輯器,能夠很好得完成對多個文件的一系列編輯工作。sed提供的功能好像是交互式腳本的自然延伸,它提供的查找和替換程序可以被全局的應用于單個文件或者一組多個文件之中。
sed相對于交互式的vi/vim編輯器的優點是:
-
sed能夠在一個地方指定所有的編輯指令(查找、替換、刪除、插入等),然后通過文件傳遞一次來執行它們。不必進入每個文件進行修改。
vi/vim針對以上編輯指令(查找、替換、刪除、插入等)則需要消耗大量的時間。 -
sed能夠保持整個文檔的一致性。可以通過查找某一個特定術語的所有不同的使用方式,使得它們能夠變得一致
-
sed支持編寫大量的轉換程序
總結:sed能夠讓我們在批量處理不同模式的文件(查找、替換、刪除、插入等)時更為便捷
語法格式
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
選項 說明
- -n 使用安靜模式,在一般情況所有的 STDIN 都會輸出到屏幕上,加入-n 后只打印被 sed 特殊處理的行
- -e 多重編輯,且命令順序會影響結果
- -f 指定一個 sed 腳本文件到命令行執行,
- -r Sed 使用擴展正則
- -i 直接修改文檔讀取的內容,不在屏幕上輸出
sed 操作地址
sed在沒有指定操作行范圍時,默認操作所有行
number僅僅匹配指定的行號,并進行操作;比如使用安靜模式,打印某一個文件的第十行sed -n 10p test.txtfirst~step匹配從first起始,每隔step行匹配一次;比如sed -n 2~5p test.txt表示從第二行開始,每隔5行打印一次,即打印:2,7,12,17…行$匹配最后一行sed -n '$'p test.txt/REGEXP/這個是表示匹配正則那一行,通過//之間的正則來匹配,sed -n /[0-9]/p test.txt匹配包含0-9中任意數字的行\cREGEXPc這個是表示匹配正則那一行,通過\c 和 c 之間的正則來匹配,c 可以是任一字符sed -n '\m[0-9]m'p test.txt匹配包含0-9中任意數字的行0,addr2從首行開始,直到找到addr2,這里addr2需要為正則時,0才能夠生效;類似于1,addr2從第一行開始。 其中addr2可以為數字,字符串,正則表達式;sed -n 0,/[0-9]/p test.txt,這里addr2為正則,所以可以從0開始;addr1,+N從 addr1 這行到往下 N 行匹配,總共匹配 N+1 行;sed -n /[0-9]/,+5p test.txt從第一個包含數字的行開始向下找5行addr1,~N從addr1這一行向下匹配,直到匹配行號中包含N的倍數即打印;sed -n /[0-9]/,~7p test.txt,即匹配包含數字的行號開始,到某一個行號能夠被7整除為止
sed子命令
sed子命令主要是操作地址指定的各個行需要執行的方式,如果沒有指定操作地址,則默認執行針對所有行
=打印當前篩選出來的行號sed -n /[0-9]/,~7= test.txt,從test.txt中篩選包含數字的行,且只打印行數a\在當前行下添加一行或者多行sed /[0-9]/,~7a\111 test.txt向text.txt中包含數字的指定行下添加111字符串i\在當前行之上添加一行或者多行sed /[0-9]/,~7i\111 test.txt向test.txt中包含數字的指定行上添加111字符串q結束或者退出sedQ結束退出sedc\用新文本替換(修改)當前行的文本sed /[0-9]/,~7c\aa test.txt用aa代替包含數字的文本h把模式空間的內容復制到暫存空間H把模式空間的內容追加到暫存空間g把暫存空間的內容復制到模式空間(用作替換指定行中指定內容的字符串)G把暫存空間的內容追加到模式空間(用作向指定行中指定內存追加字符串)-l width列出非打印字符(結束符$,width表示寬度)sed -n /[0-9]/,+7l2 test.txtp打印行r從文件中讀取輸入行!對所選行之外的所有行應用命令s/regexp/replacement/替換命令d刪除行
sed正則表達式
sed使用實例
制造測試文件如下:top -u ceph -b -n 1|grep PID -A 10 > test.txt
打印命令 p
命令 p 是打印命令,用于顯示模式緩存區的內容。默認情況下, sed 把輸入行打印在屏幕上,同時將選定內容也打印出來,選項-n 用于取消默認打印操縱。當選項-n 和命令 p 同時出現時, sed 可打印選定的內容
sed '/27023/p' test.txt
sed -n '27023/p' test.txt
刪除命令 d
命令 d 用于刪除輸入行。sed 先將輸入行從文件復制到模式緩存區,然后對該行執行 sed命令,最后將模式緩存區的內容顯示在屏幕上。如果發出的是命令 d,當前模式緩存區的輸入行會被刪除,不被顯示
sed '27023/d' test.txt 已經刪除了2703所在的行,默認會將所有行打印到屏幕
sed '3,$d' test.txt 使用操作地址的命令,刪除從第三行開始到行末的所有行
sed '/ceph-osd/d' test.txt 刪除所有包含ceph-osd字符串的行
替換命令 s
替換命令s大體的格式為s/regexp/replacement/,s后的第一個字符串包含正則表達式,第二個字符串為需要替換掉的內容;可以使用g標記對行進行全部替換
-
sed 's/ceph-osd/testsed/g' test.txt將所有包含ceph-osd的字符串替換為testsed字符串
-
sed -n 's/^2/3/p' test.txt將所有開頭為2的字符串替換為3,并且使用-n和p命令,僅將替換的字符串打印出來
-
sed -n 's/osd$/&.sed/p' test.txt當“與”符號( &)用在替換串中時,它代表在查找串中匹配到的內容以osd結尾時在其后增加字符串.sed
-
sed -n 's/20/ceph-sed/gp' test.txt使用g將全局中所有包含20的字符串替換為ceph-sed
-
sed -n 's/\(ceph\)-osd/\1sed/gp' test.txt包含在圓括號里的模式 ceph 作為標簽 1 保存在特定的寄存器中。替換串可以通過\1 來引用它。則 ceph-osd 被替換為 cephsed
-
sed -n 's#20#ceph-sed#gp' test.txtsed中s之后的字符就是查找串和替換串之間的分隔符,分隔符默認為正斜杠,但其實只要任意跟在s之后的字符(換行符和反斜線除外)都可以作為分隔符。這個方法在查找包含正斜杠模式時很管用,例如查找路徑名或生日
指定操作地址的范圍 逗號 ,
sed -n '/ceph-mon/,/ceph-mgr/p' test.txt 指定打印從ceph-mon行開始到ceph-mgr行結束
sed -n '5,/ceph-osd/p' test.txt 打印從第5行開始到ceph-osd所在行結束
sed -n '5,/ceph-osd/s/osd$/sed/gp' test.txt 從第5行開始到遇到ceph-osd字符串所在行之間,將以osd字符串結尾的行替換為以sed結尾
多重編輯命令 e
sed -e '1,3d' -e 's/ceph-osd/ceph-sed/g' test.txt 用于 sed 執行多個編輯任務的情況下。在下一行開始編輯前,所有的編輯動作將應用到模式緩存區的行上。因為是逐行進行這兩行編輯(即這兩個命令都在模式空間的當前行上執行),所以編輯命令的順序會影響結果。
下行插入命令 a
a 命令是追加命令,追加將新文本到文件中當前行(即讀入模式的緩存區行)的后面。不管是在命令行中,還是在 sed 腳本中, a 命令總是在反斜杠的后面。
sed '/osd$/a\ hello sed' test.txt 在osd結尾的行的下面追加一行hello sed,同時hello sed前增加一個空格
上行插入命令 i
i命令類似于a命令,追加新的文本到文件當前行的前面。
sed '/m[a-z][a-z]$/i\ hello sed' test.txt 在以mon,mgr,mds結尾的行之上增加一行hello world
修改命令 c
c命令可以將已有的文本進行修改,并覆蓋舊文本
sed '/m[a-z][a-z]$/c hello sed' test.txt 將mon,mgr,mds結尾的行修改為hello sed,并覆蓋原來的行
獲取下一行命令 n
n 命令表示下一條命令。 sed 使用該命令獲取輸入文件的下一行,并將其讀入到模式緩沖區中,任何 sed 命令都將應用到匹配行,緊接著的下一行上
sed '/mgr$/{n;s/ceph-osd/ceph-sed/;}' test.txt 將以mgr結尾的下一行中,ceph-osd字符串替換為ceph-sed
轉換命令 y
y 命令表示轉換。該命令與 tr 命令相似,字符按照一對一的方式從左到右進行轉換。例如 y/abc/ABC/,會把小寫字母轉換成大寫字母, a–>A,b–>B,c–>C
sed '1,$y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' test.txt 從頭到位,將字符串中小寫字母轉換為大寫字母
退出命令 q
sed '/mgr$/{n;s/ceph-osd/ceph-sed/;q;}' test.txt 執行到替換mgr行的下一行之后就退出,不繼續打印
總結
sed的命令的優勢不必多言,詳細看到并實踐到這里的伙伴們已經深有體會。在對多個文件進行批量處理的時候Sed的作用無疑是巨大省時得,但是它并不能對多個不同的模式使用同一套規則進行處理。針對不同的字符串模式,sed需要編寫不同的匹配串進行處理,這個時候awk就能夠華麗登場,取編寫匹配規則進行文本處理。關于awk的系統性整理學習,后期將持續進行。
參考博文:
https://www.cnblogs.com/ginvip/p/6376049.html
總結
以上是生活随笔為你收集整理的s-sed(stream editor) 文本填充和编辑 基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 觉醒后会清除属性吗
- 下一篇: 输卵管堵塞对生育有影响