sed文本数据流处理命令
????在前頭講述vim的時候,提到了vim的末行命令(ex模式命令)就是sed命令(文本編輯工具),它和grep命令(文本搜索)、awk命令(文件格式化工具)并稱為文本處理三劍客。當在vim中時,我們可以通過在編輯模式下輸入“:”來使用一些命令,而這些命令也可以通過“sed”命令來在shell命令行模式下使用。sed命令全名為:Stream EDitor(流編輯器),以行為單位對一個或多個文件進行編輯處理。每一次sed都會處理給定文件中的一行內容。在sed處理文本時,將正在處理的當前行存儲到臨時的緩沖區中,稱為“模式空間”;用當前行去匹配給定的PATTERN,如果能匹配,則使用command編輯處理;如果不匹配,則默認輸出至標準輸出;然后繼續處理下一行,直到文件的末尾。與此相似的是在bash腳本中的“while read LINES”命令,舉例如下:
首先創建一個文本,包含以下內容:
[root@localhost?20170610]#?cat?test? qwe asd zxc然后創建包含如下內容的腳本并運行:
[root@localhost?20170610]#?cat?whileReadLine? #!/bin/bash while?read?LINES do echo?$LINES done?<./test[root@localhost?20170610]#?bash?whileReadLine qwe asd zxc????在這里我們可以看到“while”將“./test”文件中的內容按行讀入并進行處理。
????????但是這種方法過于麻煩,所以我們需要一個更加方便、快捷,功能更加強大的方法——“sed”命令。
sed命令:
sed - stream editor for filtering and transforming text
sed [OPTION]... 'script' [input-file]...
常用選項:
-n, --quiet, --silent:對于不能匹配模式的行,默認不輸出到屏幕;
-e script, --expression=script:多條件編輯;
-f script-file, --file=script-file:從指定的script-file中讀取腳本
注意:script-file為一個能夠定位到腳本文件的路徑,最好為絕對路徑
-i[SUFFIX], --in-place[=SUFFIX]:原文件直接編輯操作;
注意:默認情況下,sed的所有處理行為不會影響源文件的內容;
-r, --regexp-extended:使sed支持擴展正則表達式;
script:
'AddressesCommand'
Addresses(地址定界):
1.空地址:對所有文件的所有行進行處理;
2.單地址:sed對于能夠匹配該地址的那唯一一行進行處理;
num:表示行號;
/pattern/:能夠匹配該模式的所有行;
$:表示文檔最后一行
3.地址范圍:
addr1,addr2:從addr1開始到addr2結束的中間所有行;
例如:2,8:從第二行到第八行
first~step:從first標記的行號開始,以step所代表的數字為步長;
例如:2~5:第2行和第7(2+5)行
addr1,+N:從addr1開始,包括addr1所在行,并繼續向后計算N行;
例如:2,+7相當于2到9(2+7)行
addr1,~N:從addr1開始,包括addr1所在行,向后計算N的大于addr1的最小整數倍的行;
例如:2,~5相當于從第2行到第5行
又例如:3,~4相當于從第3行到4的大于3的最小倍數(也就是4)行
還例如:5,~3相當于從第5行到3的大于5的最小倍數(也就是6)行
/pattern1/,/pattern2/:從被pattern1匹配的第一行開始計算,一直到被/pattern2/匹配到的第一行結束;
Command(處理命令):
=:顯示被模式匹配的行的行號
例如:sed -n '/^$/=' /etc/grub2.cfg
a \text:在被模式匹配的行的后面追加text的內容,支持使用\n換行,從而實現多行追加;
i \text:在被模式匹配的行的前面插入text的內容,支持使用\n換行,從而實現多行插入;
c \text:將被模式匹配的行的修改為text的內容,支持使用\n換行,從而實現一行變多行;
d:在模式空間中刪除被模式匹配的行;這樣的行不能再進行標準輸出;
注意:在使用d命令的時候,不宜使用-n選項;
p:顯示模式空間中被模式匹配的行;
注意:在使用p命令的時候,通常會搭配-n選項;
w filepath:將模式空間中被模式匹配的行,另存到filepath文件中;
r filepath:將filepath文件的內容追加至模式空間中被模式匹配的行之后;
!Command:在模式空間中被模式匹配的行,不執行Command命令;相反,未被模式匹配的行,參會執行Command命令
s///:查找替換,分隔符可以任意更換,只要相同即可;
s@@@, s###, s,,,
s/pattern/text/[control]
s@/etc/fstab@/etc/mtab@
pattern:計劃查找并替換的內容
text:要替換的結果
control:如何進行替換,可用的選項有:
g:行內全部替換
p:顯示替換成功的行
w filepath:將替換成功的行另存到filepath文件中;
支持后向引用:
s/\(string\)/&/
s/\(string\)/\1/
高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D:刪除多行模式空間中的所有行
示例:
sed -n 'n;p' FILE
sed '1!G;h;$!d' FILE
sed '$!N;$!D' FILE
sed '$!d' FILE
sed ‘G’ FILE
sed ‘g’ FILE
sed ‘/^$/d;G’ FILE
sed 'n;d' FILE
sed -n '1!G;h;$p' FILE
????????對于這個sed命令,在使用的時候需要將選項和sed命令中的處理命令結合起來使用,一些常用的功能舉例如下:
????首先創建一個文本文件,包含以下內容:
[root@localhost?20170611]#?cat?test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin3daemon:x:2:2:daemon:/sbin:/sbin/nologin4adm:x:3:4:adm:/var/adm:/sbin/nologin5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin [root@localhost?20170611]#????????使用這個命令,會顯示匹配到的行,因為加上了“-n”選項,所以僅僅輸出一個匹配到的行號“7”,在單引號中的兩個斜杠之間是匹配的模式,使用正則表達式來匹配
[root@localhost?20170611]#?sed?-n?'/shutdown/='?test1 7 [root@localhost?20170611]#“p”命令
????如果想要顯示行中的內容,使用“p”命令,顯示第五行:
[root@localhost?20170611]#?sed?-n?'5p'?test15lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin????還可以顯示其他的行,具體的使用請查看上面提到的地址定界:
[root@localhost?20170611]#?sed?-n?'1,5p'?test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin3daemon:x:2:2:daemon:/sbin:/sbin/nologin4adm:x:3:4:adm:/var/adm:/sbin/nologin5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@localhost?20170611]#?sed?-n?'1~5p'?test11root:x:0:0:root:/root:/bin/bash6sync:x:5:0:sync:/sbin:/bin/sync [root@localhost?20170611]#“a”命令
????在第二行的下面添加內容(此時需要去掉“-n”選項才能更清楚的看到效果):
[root@localhost?20170611]#?sed?'2a?abcd'?test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin abcd3daemon:x:2:2:daemon:/sbin:/sbin/nologin4adm:x:3:4:adm:/var/adm:/sbin/nologin5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin [root@localhost?20170611]#????還可以同時在多行下同時加上內容,同時在第二行到第四行的下面加上內容:
[root@localhost?20170611]#?sed?'2,4a?abcd'?test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin abcd3daemon:x:2:2:daemon:/sbin:/sbin/nologin abcd4adm:x:3:4:adm:/var/adm:/sbin/nologin abcd5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin [root@localhost?20170611]#????如果想要在同一行的下面同時加上多行,使用“\n”進行換行:
[root@localhost?20170611]#?sed?'2,4a?abcd\nefg'?test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin abcd efg3daemon:x:2:2:daemon:/sbin:/sbin/nologin abcd efg4adm:x:3:4:adm:/var/adm:/sbin/nologin abcd efg5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin [root@localhost?20170611]#????“i”命令與“a”命令幾乎相同,“a”命令是在一行的后面添加一行,“i”命令是在一行的前面添加一行,在這里就不再舉例
“c”命令
????這個命令可以用來進行內容的替換,比如將第二行的內容替換掉:
[root@localhost?20170611]#?sed?'2c?abcd'?test11root:x:0:0:root:/root:/bin/bash abcd3daemon:x:2:2:daemon:/sbin:/sbin/nologin4adm:x:3:4:adm:/var/adm:/sbin/nologin5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin [root@localhost?20170611]#????????同“a”等命令相似,這個命令也可以同時修改多行,比如同時替換第三行到第四行的內容,不過替換后的內容只會顯示一次,不會重復:
[root@localhost?20170611]#?sed?'3,4c?abcd'?test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin abcd5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6sync:x:5:0:sync:/sbin:/bin/sync7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin [root@localhost?20170611]#“d”命令
????刪除特定的行,比如刪除第三行到第六行:
[root@localhost?20170611]#?sed?'3,6d'?test11root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/nologin7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8halt:x:7:0:halt:/sbin:/sbin/halt9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin [root@localhost?20170611]#????刪除第二行到最后一行:
[root@localhost?20170611]#?sed?'2,$d'?test11root:x:0:0:root:/root:/bin/bash [root@localhost?20170611]#“s”命令
????????這個命令可以用來進行字符的替換,比如將文本中的所有“:”替換成“@@@”:
[root@localhost?20170611]#?sed?'s/:/@@@/g'?test11root@@@x@@@0@@@0@@@root@@@/root@@@/bin/bash2bin@@@x@@@1@@@1@@@bin@@@/bin@@@/sbin/nologin3daemon@@@x@@@2@@@2@@@daemon@@@/sbin@@@/sbin/nologin4adm@@@x@@@3@@@4@@@adm@@@/var/adm@@@/sbin/nologin5lp@@@x@@@4@@@7@@@lp@@@/var/spool/lpd@@@/sbin/nologin6sync@@@x@@@5@@@0@@@sync@@@/sbin@@@/bin/sync7shutdown@@@x@@@6@@@0@@@shutdown@@@/sbin@@@/sbin/shutdown8halt@@@x@@@7@@@0@@@halt@@@/sbin@@@/sbin/halt9mail@@@x@@@8@@@12@@@mail@@@/var/spool/mail@@@/sbin/nologin10uucp@@@x@@@10@@@14@@@uucp@@@/var/spool/uucp@@@/sbin/nologin [root@localhost?20170611]#????????如果替換后頭的字符為空,就可以當成刪除的命令,比如去掉“@@@”即為刪除“:”:
[root@localhost?20170611]#?sed?'s/://g'?test11rootx00root/root/bin/bash2binx11bin/bin/sbin/nologin3daemonx22daemon/sbin/sbin/nologin4admx34adm/var/adm/sbin/nologin5lpx47lp/var/spool/lpd/sbin/nologin6syncx50sync/sbin/bin/sync7shutdownx60shutdown/sbin/sbin/shutdown8haltx70halt/sbin/sbin/halt9mailx812mail/var/spool/mail/sbin/nologin10uucpx1014uucp/var/spool/uucp/sbin/nologin [root@localhost?20170611]#????????有點時候“/”這個符號會重復,此時我們可以換一個符號,只要三個一樣即可,比如將所有的“/”替換為“$”:
[root@localhost?20170611]#?sed?'s@/@$@g'?test11root:x:0:0:root:$root:$bin$bash2bin:x:1:1:bin:$bin:$sbin$nologin3daemon:x:2:2:daemon:$sbin:$sbin$nologin4adm:x:3:4:adm:$var$adm:$sbin$nologin5lp:x:4:7:lp:$var$spool$lpd:$sbin$nologin6sync:x:5:0:sync:$sbin:$bin$sync7shutdown:x:6:0:shutdown:$sbin:$sbin$shutdown8halt:x:7:0:halt:$sbin:$sbin$halt9mail:x:8:12:mail:$var$spool$mail:$sbin$nologin10uucp:x:10:14:uucp:$var$spool$uucp:$sbin$nologin [root@localhost?20170611]#????????在上面的例子中我都是使用的字符串進行匹配,但是在實際的使用中我們可以將字符串替換為正則表達式來進行匹配(正則表達式查看原先的博客)
轉載于:https://blog.51cto.com/11142243/1940533
總結
以上是生活随笔為你收集整理的sed文本数据流处理命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS-最全的App上架教程
- 下一篇: Vector3 *2 ,ToString