sed行文本处理工具
Sed是一種流編輯器,過濾和替換文本
工作原理:
? 簡單的來說,Sed一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱之為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行。直到文件末尾。
語法:
sed [option] [script'(sed自帶語法腳本)] [input-file處理的文件]
sed [選項] + "地址+命令 " file
常用option參數(+描述):
| --help: | 獲取幫助信息; |
| -n: | 不輸出模式空間內容到屏幕,即不自動打印,配合編輯命令只打印符合條件字符串; |
| -e: | 多點編輯,可添加多個腳本; |
| -f: | /PATH/SCRIPT_FILE,從指定文件中讀取編輯腳本; |
| -i: | 原文件編輯(直接修改原處理文件),不添加-i參數,不會對原文件進行修改; |
| -r : | 支持使用擴展的正則表達式; |
Script:
? 地址+命令
? 地址:
? ?1.不給地址:對全文進行處理;
? ?2.單地址:
? ? ?#:指定的行(1p,2p...)
? ? ?/pattern/:被模式匹配匹配到的字串行
? ?3.范圍地址:
? ? ?#,#:第幾行只第幾行(1,2p)
? ? ?#,+#:從第#行起始向后+#行
? ? ?/pat1/,/pat2/:模式1匹配 所在行至模式2匹配所在行
? ? ?#,/pat/:第幾行只模式匹配行? ? ? ? ? ?
? ?4.~:步進
? ? ?1~2:奇數行
? ? ?2~2:偶數行
編輯命令:
| d: | 刪除模式空間匹配的行; |
| p: | 顯示模式空間中的內容; |
| a \text: | 在指定行后追加文本,支持使用\n多行追加文本; |
| i \test: | 在行前面插入文本,支持使用\n實現多行插入; |
| c \test: | 替換行為單行或多行文本; |
| w /PATH/Somefile: | 保存模式匹配的行至指定文件; |
| r /PATH/Somefile: | 讀取指定文件的文本至模式空間中匹配到的行后; |
| =: | 為模式空間中的行打印行號; |
| !: | 模式空間中匹配行取反操作; |
sed查找替換:
s///:查找替換,只是吃用其他分隔符:
? s@@@
? s###
替換標記:
? g:行內全局替換
? p:顯示替換成功的行
? w /PATH/TO/Somefile:將替換成功的行報錯至文件中
操作原文件:
[root@GaoServer?~]#?cat?-n?Test.txt?1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin匹配打印(p):
#打印匹配root開頭的行: #每一行都讀到模式空間,不加-n參數默認進行輸出,這里看到root:x:0:0:root:/root:/bin/bash輸出兩行 [root@GaoServer?~]#?cat?Test.txt?|?sed?'/^root/p' root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin[root@GaoServer?~]#?tail?Test.txt?|?sed?-n?'/^root/p' root:x:0:0:root:/root:/bin/bash#打印包含root的行: [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?'/root/p'1 root:x:0:0:root:/root:/bin/bash10 operator:x:11:0:operator:/root:/sbin/nologin#打印第二行: [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?'2p'2 bin:x:1:1:bin:/bin:/sbin/nologin [root@GaoServer?~]##打印第一行到,第三行: [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?'1,3p'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin#打印第三行起始后三行: [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?'3,+3p'3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync#打印以nologin結尾的行:(匹配) [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?'/nologin$/p'2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin#打印root開頭行至daemon開頭行 [root@GaoServer?~]#?sed?-n?'/^root/,/^daemon/p'?Test.txt? root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin#打印最后一行 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?'$p'10 operator:x:11:0:operator:/root:/sbin/nologin#不打印最后一行:(“!”表示取反) [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?'$!p'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin#打印奇數行 [root@GaoServer?~]#?cat?-n?Test.txt?|sed?-n?'1~2p'1 root:x:0:0:root:/root:/bin/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin#打印偶數行 [root@GaoServer?~]#?cat?-n?Test.txt?|sed?-n?'2~2p'2 bin:x:1:1:bin:/bin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync8 halt:x:7:0:halt:/sbin:/sbin/halt10 operator:x:11:0:operator:/root:/sbin/nologin#引用變量:sed命令使用單引號:變量用單引號引起來,sed命令使用雙引號,解釋特殊符號原有意義 [root@GaoServer?~]#?a=1 [root@GaoServer?~]#?b=2 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?''$a','$b'p'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?"$a,"$b"p"1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin匹配刪除(d):
#刪除匹配root行 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'/root/d'2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin#刪除第二行 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'2d'1 root:x:0:0:root:/root:/bin/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin#刪除1至9行 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'1,9d'10 operator:x:11:0:operator:/root:/sbin/nologin#刪除偶數行 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'2~2d'1 root:x:0:0:root:/root:/bin/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin#刪除配置文件中以(#開頭的行和空行) [root@GaoServer?~]#?sed?'/^#/d;/^$/d'?/etc/vsftpd/vsftpd.conf? anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES替換(s///):
#替換root字符串為ROOT,s///:只是替換每行中第一個匹配到的字符串 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'s/root/ROOT/'1 ROOT:x:0:0:root:/root:/bin/bash????????????????#第一行中只有第一個root替換成ROOT2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/ROOT:/sbin/nologin????#唯一一個root#全局替換root字符串為ROOT,s///g [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'s/root/ROOT/g'1 ROOT:x:0:0:ROOT:/ROOT:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/ROOT:/sbin/nologin#正則匹配 [root@GaoServer?~]#?sed?-n?'s/^root/ROOT/p'?Test.txt? ROOT:x:0:0:root:/root:/bin/bash#分組使用:取出基本名,目錄名 [root@GaoServer?~]#?dirname?/etc/sysconfig/sshd? /etc/sysconfig [root@GaoServer?~]#?basename?/etc/sysconfig/sshd? sshd [root@GaoServer?~]#?echo?"/etc/sysconfig/sshd"?|?sed?-r?'s#(/.*/)([^/]+/?)#\1#' /etc/sysconfig/ [root@GaoServer?~]#?echo?"/etc/sysconfig/sshd"?|?sed?-r?'s#(/.*/)([^/]+/?)#\2#' sshd#使用&命令引用匹配內容并且替換, #注:&代表root,&.1:把root替換成root.1 [root@GaoServer?~]#?cat?-n?Test.txt?|sed?'s/root/&.1/g'1 root.1:x:0:0:root.1:/root.1:/bin/bash ......#為1,2行添加注釋 [root@GaoServer?~]#?cat?-n?Test.txt?|sed?'1,2s/^/#/' #?????1 root:x:0:0:root:/root:/bin/bash #?????2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 ADM:x:3:4:ADM:/var/ADM:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin多點編輯(-e):
[root@GaoServer?~]#?cat?-n?Test.txt?|sed?-e?'4,5d'?-e?'s/root/ROOT/g'1 ROOT:x:0:0:ROOT:/ROOT:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/ROOT:/sbin/nologin添加/追加內容(a,i,c):
#i:在搜索匹配到的上一行添加 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'/root/i?\Root' Root1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin ......#a:在搜索匹配的下一行添加 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'/root/a?\Root'1 root:x:0:0:root:/root:/bin/bash Root2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin ......#c:替換搜索匹配的行 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'/root/c?\Root' Root2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin ......注:同樣可以指定地址單行添加,指定地址范圍添加......
保存模式匹配的行至指定文件(w):
#匹配1,2行追加Test1 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'1,2w?Test1'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin [root@GaoServer?~]#?cat?Test11 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin讀取指定文件的文本追加至模式空間(r):
#讀取/etc/redhat-release,追加至1,2行 [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?'1,2r?/etc/redhat-release'1 root:x:0:0:root:/root:/bin/bash CentOS?Linux?release?7.2.1511?(Core)?2 bin:x:1:1:bin:/bin:/sbin/nologin CentOS?Linux?release?7.2.1511?(Core)?3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin匹配到的行號:
#=: [root@GaoServer?~]#?cat?-n?Test.txt?|?sed?-n?'/root/=' 1 10原文件編輯(i):
[root@GaoServer?~]#??sed?-i?'s/adm/ADM/g'?Test.txt [root@GaoServer?~]#?cat?Test.txt? root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ADM:x:3:4:ADM:/var/ADM:/sbin/nologin ......注意:由于-i參數修改原配置文件,操作比較危險,可以使用-i.bak執行,生成源文件.bak就是之前沒有改動的文件(bak是自己制定,隨意指定)。
[root@GaoServer?~]#?sed?-i.bak?'1,7d'?Test.txt? [root@GaoServer?~]#?cat?Test.txt halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@GaoServer?~]#?cat?Test.txt.bak????????#原文件備份 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ADM:x:3:4:ADM:/var/ADM:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin空間操作:
| n: | 讀取匹配到的行的下一行覆蓋至模式空間; |
| N: | 讀取匹配到的行的下一行追加至模式空間; |
| h: | 模式空間中內容覆蓋至保持空間中; |
| H: | 模式空間中的內容追加至保持空間中; |
| g: | 從保持空間取出數據覆蓋至模式空間; |
| G: | 從保持空間取出內容追加至模式空間; |
| d: | 刪除模式空間中的行; |
| D: | 刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,對剩余模式空間重新執行sed; |
| x: | 模式空間中內容與保持空間內容進行互換; |
轉載于:https://blog.51cto.com/gning/1962336
總結
以上是生活随笔為你收集整理的sed行文本处理工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用 Nginx 基于 Let's Eng
- 下一篇: 洛谷——P1547 Out of Hay