行編輯器sed與vim文本處理器
一.行編輯器sed的使用介紹
sed英文全稱stream editor,行編輯器。其工作模式為將文件中內容按行轉移至sed模擬空間中,根據地址判定此行是否匹配,如果匹配,根據命令輸出并打印,如果不匹配,按照默認打印到屏幕上。它的作用是根據選項和地址界定‘script’命令實現對符合相關篩選條件的行更改顯示。其用法為:sed [option]… 'script' file 。
1.選項
-n:只顯示匹配到的行,不匹配的行統統不顯示
-e:多點編輯
-f 文件絕對路徑:從指定路徑文件中讀取編輯腳本
-r:支持使用擴展正則表達式
-i:在原文件中編輯
只有選項無法匹配所需要的固定行,這里需要搭配地址命令‘script’選取固定范圍來使用。
2.地址
地址范圍的選定有時會根據正則表達式的形式匹配,常見的地址范圍規定有如下:
a.單地址
#(數字):代表所匹配的固定行
/pattern/:pattern匹配的符合條件的每一行
b.無地址:對全局進行處理
c.地址范圍
#1,#2:從#1行到#2行
#1,+#2:從#1開始,一直到#1+#2之間的所有行
/part1/,/part2/:從符合part1的第一行到符合part2的第一行的中間所有行
#,/part/:從第#行到符合part條件的第一行中間的所有行
d.步進表示
~:1~2代表奇數行
2~2代表偶數行 (#1~#2說白了就是選取從#1開始每隔#2-1行的所有行)
3.編輯命令
d:刪除匹配行
p:顯示模式空間的內容
i /test:在行前面插入test文本內容,支持使用\n進行多行插入
a /test:在行后面插入test文本內容,支持使用\n進行多行插入
c /test:替換行為test文本,也支持使用多行替換
w /path/to/somefile:保存匹配的行內容至指定文件中
r /path/to/somefile:讀取指定文件內容至模式空間中匹配到的行的行后
=:將模式空間行的行數打印出來
?。耗J娇臻g匹配的行進行取反處理
基本使用方式如下所例:
1.顯示文件f2中以user[0-9]命名的用戶
[root@localhost testdir]# cat f2 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ...
[root@localhost testdir]# sed -n '/user[0-9]/p' f2 48 user1:x:1100:1102:dafeige:/home:/bin/bash 49 user2:x:1101:1101:dafeige:/home:/bin/bash
2.使用管道連接并在f2文件的第46行上,下加入“wohenshuai”的文本內容。第三個命令是將第46行內容替換成“wohenshuai”
[root@localhost testdir]# sed -n '46p' f2|sed 'a wohenshuai' 46 harry:x:1004:1005::/home/harry:/bin/bash wohenshuai [root@localhost testdir]# sed -n '46p' f2|sed 'i wohenshuai' wohenshuai 46 harry:x:1004:1005::/home/harry:/bin/bash [root@localhost testdir]# sed -n '46p' f2|sed 'c wohenshuai' wohenshuai
3.取反的使用示例,這里使用!將包含非‘echo’的行顯示打印
[root@localhost testdir]# cat f1 #!/bin/bash echo "mike a temp file" echo mktemp /temp/test.XXXX [root@localhost testdir]# sed -n '/echo/!p' f1 #!/bin/bash mktemp /temp/test.XXXX
4.多點操作-e的使用:在xiaojiji文件選取含有root或兩位數的行,顯示打印
[root@localhost testdir]# sed -n -e '/\<[[:digit:]][[:digit:]]\>/p' -e '/root/p' xiaojiji root:x:0:0:root:/root:/bin/bash mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
4.行編輯內容的查找替換(比較常用)
‘s///’或‘s@@@’或‘s###’前兩個//或@@或##之間為查詢的匹配內容,后兩個符號之間為替換內容,如果想要在原內容上追加內容,可以使用&表示查找的原內容。舉例說明:
將文件f1中所有以#打頭的行前面加上一個$符號:
[root@localhost testdir]# cat f1 #!/bin/bash echo "mike a temp file" echo mktemp /temp/test.XXXX [root@localhost testdir]# sed 's/^#/$&/' f1 $#!/bin/bash echo "mike a temp file" echo mktemp /temp/test.XXXX
其中地址可以使用's@^#@$&@'或's#^\##$&#'來代替。
sed存在高級模式為h,H,G,g,x,n,D,d等,涉及到模式空間下的保持空間內容,這里不做敘述,相關內容在pdf文件中。
二.vim編輯器的強大功能
與nano文本編輯不同,vim作為vi的強化版文本編輯器,有著強大但眾多的編輯功能,使用便利但由于編輯方式眾多,不如nano簡潔,所以對于初學者無法短期內熟練掌握其所有編輯方式。其操作模式分為命令模式、編輯模式、擴展命令模式三大種。其模式的轉換由鍵盤上的固定字符執行:Esc、:、i、v。其轉換關系如下圖:
1.vim打開文件的方式
vim編輯器可以使用‘+’選項指定一些特定的方式進入文本模式:
vim [option]… File…
[option]:
+#:進入文本讓光標停留在第#行行首
+/pattern:進入文本讓光標停留在第一個匹配到pattern行的行首
+:進入文本光標停留在最后一行行首
-d file1 file2:對比file1與file2兩個文件內容
-m:只讀打開文件
-e:直接進入擴展命令模式
vim編輯器支持打開多個文件,vim file1 file2 file3….。并按照從左到右順序打開,切換到擴展命令模式‘:’輸入特定內容可實現文件內容的切換操作,如下所示:
:next 顯示下一個文件內容
:prev 顯示上一個文件內容
:first 顯示第一個文件內容
:last 顯示最后一個文件內容
:wall 保存所有內容
:qall 退出所有文件
:wqall 保存并退出所有文件
2.命令模式下常用的編輯命令
當不加入選項進入vim編輯模式時,光標默認停留在首行行首上。這時鍵盤上的字母并不能編輯內容,而分別帶有特殊意義。比如h,j,k,l代表控制光標的上下左右移動,效果等同于方向鍵。這里選取比較常見并且方便的由命令模式編輯文件的特殊字符:
刪除命令d:
d$/D:刪除當前行行標至行尾所有內容
dd:刪除行標所在當前行
d0:刪除當前行行首至行標所有內容
d^:刪除當前行非空格行首至行標內容
dw,de,db:刪除當前光標單詞的操作。db表示刪除行標所在處單詞的詞首至光標的字符,dw,de表示刪除光標至詞尾的字符
復制命令y:
y$:復制光標至行尾內容
y0:復制行首至光標內容
y^:復制非空格行首至光標內容
Y/yy:復制當前行
粘貼命令p:
p:粘貼至當前行標下方
P:粘貼至當前行標上方
命令模式中粘貼多次字符的方式:100[i]mcgee[Esc] 其中[]內代表操作字符,[i]切換至編輯模式輸入需要重復粘貼的字符,100為粘貼次數,mcgee為粘貼的字符,[Esc]鍵返回命令模式并執行重復粘貼操作。
改變命令c:
c:修改后切換至編輯模式
cc:刪除當前行并切換至編輯模式
C/c$:刪除行標至當前行尾內容并切換至編輯模式
c0:刪除行首至行標內容并切換至編輯模式
c^:刪除非空格行首至行標的內容并切換至編輯模式
個人常用快速跳轉光標操作(必須在命令模式下):G(跳轉至文本最后行)、gg(跳轉至文本首行)、0(跳轉至當前行行首)、^(跳轉至當前行非空格行首)、$(跳轉至當前行行尾)、ctrl+左右(單詞跳轉)。
恢復操作u:
u:恢復之前內容。(這個功能非常重要,如果發生誤操作更改,使用u即可恢復之前一次操作的文本內容了)
U:撤銷當前光標所在行的所有更改
2.擴展模式的常用操作
‘:’代表切換至擴展模式,比如:q,:w,:wq!等代表保存文件以及退出與強制退出等。其實擴展命令模式看來有點像輸入命令,Enter鍵入后執行對文本內容的操作,所以可以根據正則表達式的索引范圍對特定字符的匹配行進行查找,找到后可執行修改操作。比如:
:s///(@@@)(###)就與sed命令中的s///查找更改的作用一樣。舉例如下:
文件f1內容如下:
#!/bin/bash echo "mike a temp file" echo mktemp /temp/test.XXXX ~
找尋文件中的bash,并將bash替換成csh
:s/bash/csh/g
于是文件f1內容變為如下:
#!/bin/csh echo "mike a temp file" echo mktemp /temp/test.XXXX
默認情況下只匹配每行的第一個匹配字符,其中g代表匹配全局,還有i,代表忽略大小寫字符匹配
在擴展模式中經常使用查找匹配的相關功能,下面介紹一些擴展模式地址匹配的界定符號:
#(數字):指定#行
#1,#2:指定#1至#2之間行 比如2,5 指2-5行
#1,+#2:指定從#1至#1+#2之間行 比如2,+3 指2-5行
.:代表當前行
$:代表最后一行,$-1代表倒數第二行,以此類推$-n…代表倒數第n-1行
%:代表全局,整個文本
/pat1/,/pat2/:第一個匹配/pat1/的行至第一個匹配/pat2/的行
/pat/支持使用正則表達式,可以與上述符號使用,如/path/,$代表匹配pat的第一行至最后一行
這些地址界定在擴展模式的使用需要遵循固定格式,要在前面使用,后面跟上輸出命令,比如:
比如f2文件內容部分如下:
33 saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin 34 libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin 35 pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin 36 gdm:x:42:42::/var/lib/gdm:/sbin/nologin 37 gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin 38 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin 39 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 40 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 41 ntp:x:38:38::/etc/ntp:/sbin/nologin
前面是個人使用echo重定向輸入的行號,便于觀察者理解?,F在使用擴展模式刪除36-39行的所有字母字符,如下操作:
:36,39s/[[:alpha:]]*//g
于是文本內容變為:
33 saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin 34 libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin 35 pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin 36 ::42:42::///:// 37 --::989:984:://--/:// 38 ::70:70: /- :///-:// 39 ::74:74:- :///:// 40 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 41 ntp:x:38:38::/etc/ntp:/sbin/nologin 42 tcpdump:x:72:72::/:/sbin/nologin
3.可視化模式VISUAL
命令模式下v鍵切換至visual模式,結合d,y,p等命令,可以對選定的塊進行操作,舉例說明:
v鍵進入可視化模式,還是使用f2文件:
~ ~ -- VISUAL --
光標選定塊如圖:
按d刪除,如下:
這里需要注意的是光標停留位置很重要,以這個位置為分隔符,可以向前或者后面內容進行移動,達到隨意選取的功能。
原創文章,作者:mcgeewang,如若轉載,請注明出處:http://www.www58058.com/31612
關于sed和vim總結的很好,很詳細,sed可以有一些示例,這樣看起來會更豐滿哦。