sed與vim
sed
Stream EDitor, 行編輯器,sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”( pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等。
用法:
sed [option]… 'script' inputfile…
script: '地址命令'
常用選項:
-n:不輸出模式空間內容的自動打印
-e: 多點編輯
-f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本
-r: 支持使用擴展正則表達式
-i: 原處編輯
注意這里:↓
sed -i.bak '^U /r /etc/issue' f3
更f3文件之前先把f3文件備份為 f3.bak文件,在對f3文件進行更改
編輯命令:
d: 刪除模式空間匹配的行
p: 顯示模式空間中的內容
a \text:在行后面追加文本;支持使用\n實現多行追加
sed ‘/root/a\superman’ /etc/passwd
[root@centos6 ~]# sed '/root/a\superman' /etc/passwd root:x:0:0:root:/root:/bin/bash superman 在匹配到的root行行后追加superman
i \text:在行前面插入文本;支持使用\n實現多行插入
sed ‘/root/i\superman’ /etc/passwd
[root@centos6 ~]# sed '/root/i\superman' /etc/passwd superman root:x:0:0:root:/root:/bin/bash 在匹配到的root行行前追加superman
c \text:替換行為單行或多行文本
[root@centos6 ~]# sed '/root/c\superman' /etc/passwd superman bin:x:1:1:bin:/bin:/sbin/nologin 代替匹配到的行
w /path/to/somefile: 保存模式匹配的行至指定文件
[root@centos6 ~]# sed '/root/ w/etc/issue' /etc/passwd root:x:0:0:root:/root:/bin/bash [root@centos6 ~]# cat /etc/issue root:x:0:0:root:/root:/bin/bash
r /path/from/somefile:讀取指定文件的文本至模式空間中匹配到的行后
[root@centos6 ~]# sed '/root/ r/etc/issue' /etc/passwd root:x:0:0:root:/root:/bin/bash CentOS release 6.8 (Final) Kernel \r on an \m
=: 為模式空間中的行打印行號
!:模式空間中匹配行取反處理
s///:查找替換,支持使用其它分隔符,s@@@,s###
地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址: #: 指定的行 /pattern/:被此處模式所能夠匹配到的每一行
[root@centos6 ~]# nl /etc/passwd | sed -n 3p 3daemon:x:2:2:daemon:/sbin:/sbin/nologin
(3) 地址范圍: #,# #,+# /pat1/,/pat2/ #,/pat1/
[root@centos6 ~]# sed -n '1,6p' /etc/passwd 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
(4) ~:步進 1~2 奇數行 2~2 偶數行
[root@centos6 ~]# nl /etc/passwd | sed -n 1~2p 1root:x:0:0:root:/root:/bin/bash 3daemon:x:2:2:daemon:/sbin:/sbin/nologin 5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin [root@centos6 ~]# nl /etc/passwd | sed -n 2~2p 2bin:x:1:1:bin:/bin:/sbin/nologin 4adm:x:3:4:adm:/var/adm:/sbin/nologin 6sync:x:5:0:sync:/sbin:/bin/sync 8halt:x:7:0:halt:/sbin:/sbin/halt 10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
替換標記:
g: 行內全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
看下這幾個示例:
1、sed ‘/^$/d’ file
[
root@centos6 ~]# cat -n /etc/issue 1CentOS release 6.8 (Final) 2Kernel \r on an \m 3 [root@centos6 ~]# nl /etc/issue | sed '/^$/d' 1CentOS release 6.8 (Final) 2Kernel \r on an \m 通過示例看出編輯命令d刪除/^$/(空行)
2、nl /etc/passwd | sed ‘2,5d’
[root@centos6 ~]# nl /etc/passwd | sed '2,5d' 1root:x:0:0:root:/root:/bin/bash 6sync:x:5:0:sync:/sbin:/bin/sync 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8halt:x:7:0:halt:/sbin:/sbin/halt 9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 刪除第二道第五行。
3、nl /etc/passwd | sed ‘2a tea’
[root@centos6 ~]# nl /etc/passwd | sed '2a tea' 1root:x:0:0:root:/root:/bin/bash 2bin:x:1:1:bin:/bin:/sbin/nologin tea 3daemon:x:2:2:daemon:/sbin:/sbin/nologin 第二行后追加tea
4、sed –n‘s/root/&superman/p’ /etc/passwd
[root@centos6 ~]# sed -n 's/root/&superman/p' /etc/passwd rootsuperman:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/rootsuperman:/sbin/nologin &為引用前面的root,在root單詞后后追加superman
5、sed –n‘s/root/superman&/p’ /etc/passwd 單詞前
同上面的示例。
6、-e選項:
[root@centos6 ~]# cat f1 zang zang zang root root root 1234 1234 1234 zang root 1234 [root@centos6 ~]# sed -e 's/root/root1/pg' -e 's/zang/haha/pg' -n f1 haha haha haha root1 root1 root1 zang root1 1234 haha root1 1234 (-n:不輸出模式空間內容的自動打印。) [root@centos6 ~]# sed -e 's/root/root1/pg' -e 's/zang/haha/pg' f1 haha haha haha 替換后輸出到顯示器 haha haha haha 默認輸出到顯示器 root1 root1 root1 替換后輸出到顯示器 root1 root1 root1 默認輸出到顯示器 1234 1234 1234 沒有匹配更改,默認輸出到顯示器 zang root1 1234 先匹配root,更改后輸出到顯示器 haha root1 1234 匹配到zang,更改后顯示輸出到顯示器 haha root1 1234 默認輸出到顯示器
7、顯示空行號和打印空行號:
sed -n ‘/^$/=’ file 顯示空行行號 [root@centos6 ~]# sed -n '/^$/=' /etc/issue 3 sed –n –e ‘/^$/p’ –e ‘/^$/=’ file ? [root@centos6 ~]# sed -n -e '/^$/p' -e '/^$/=' /etc/issue 3 打印空行,為空行打印行號。
8、地址界定的用法之一: #,/pat1/
sed –n ‘2,/lp/p’ /etc/passwd
[root@centos6 ~]# nl /etc/passwd | sed -n '2,/lp/p' 2bin:x:1:1:bin:/bin:/sbin/nologin 3daemon:x:2:2:daemon:/sbin:/sbin/nologin 4adm:x:3:4:adm:/var/adm:/sbin/nologin 5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 從2行開始到匹配到的lp的行
高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
在來看下這些示例:
sed -n 'n;p' FILE
[root@centos6 ~]# nl /etc/passwd | sed -n 'n;p' 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 8 halt:x:7:0:halt:/sbin:/sbin/halt 10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 12 games:x:12:100:games:/usr/games:/sbin/nologin 14 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 16 dbus:x:81:81:System message bus:/:/sbin/nologin 偶數行
sed '$!N;$!D' FILE
[root@centos6 ~]# nl /etc/passwd | sed '$!N;$!D' 除了最后一行 40 mage:x:505:505::/home/mage:/bin/bash 41 zanghl:x:506:506::/home/zanghl:/bin/bash 顯示后兩行
sed '$!d' FILE
[root@centos6 ~]# nl /etc/passwd | sed '$!d' 41 zanghl:x:506:506::/home/zanghl:/bin/bash 除了最后一行全部都刪除,只顯示最后一行。
sed ‘G’ FILE
[root@centos6 ~]# sed 'G' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin 給每一行追加一個空行
sed ‘g’ FILE
g: 從保持空間取出數據覆蓋至模式空間
保持空間為空,復制后的結果就是把原文件的每一行都變成空行。
sed ‘/^$/d;G’ FILE
[root@centos7 ~]# sed '/^$/d;G' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ... 刪除空行;(G:從保持空間取出內容追加至模式空間),保持空間為空,追加輸出到模式空間。 這個命令輸出的結果就是在沒行下面加一個空行。
sed 'n;d' FILE
[root@centos7 ~]# nl /etc/passwd | sed 'n;d' 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
sed -n '1!G;h;$p' FILE
[root@centos7 ~]# sed -n '1!G;h;$p' /etc/passwd mage:x:19999:19999::/home/mage:/bin/csh zzzz:x:2012:2012::/home/zzzz:/bin/bash roobash:x:2011:2011::/home/roobash:/bin/bash rootash:x:2010:2010::/home/rootash:/bin/bash nologin:x:2009:2009::/home/nologin:/bin/bash basher:x:2008:2008::/home/basher:/bin/bash 倒敘。
vim編輯器
vi編輯器是所有Unix及Linux系統下標準的編輯器,他就相當于windows系統中的記事本一樣,它的強大不遜色于任何最新的文
本編輯器。他是我們使用Linux系統不能缺少的工具。由于對Unix及Linux系統的任何版本,vi編輯器是完全相同的,學會它后,您將在Linux的世界里暢行無阻。
vim具有程序編輯的能力,可以以字體顏色辨別語法的正確性,方便程序設計;因為程序簡單,編輯速度相當快速。vim可以當作
vi升級版本,他可以用多種顏色的方式來顯示一些特殊的信息。vim會依據文件擴展名或者是文件內的開頭信息,判斷該文件的內容
而自動的執行該程序的語法判斷式,再以顏色來顯示程序代碼與一般信息。vim里面加入了很多額外的功能,例如支持正則表達式的
搜索、多文件編輯、塊復制等等。 這對于我們在Linux上進行一些配置文件的修改工作時是很棒的功能。
使用vi和vim的三種主要模式:
三種主要模式:
命令模式(默認):移動光標,剪切/粘貼文本(進入vi的默認模式,能夠進行復制、黏貼、刪除等操作)
100iwang [ESC] 粘貼“wang”100次
<start position><command><end position>
Command:
y 復制、d 刪除、gU 變大寫、gu 變小寫
例如 0y$ 命令意味著:0 → 先到行頭
y → 從這里開始拷貝
$ → 拷貝到本行最后一個字符
ye 從當前位置拷貝到本單詞的最后一個字符
插入(編輯)模式:修改文本(從默認模式按下‘i’即可進入)
擴展命令模式:保存,退出等(從默認模式按下“:”、'?'、'/'即可進入)
地址定界:
:start_pos,end_pos
#: 具體第#行,例如2表示第2行
#,#: 從左側#表示行起始,到右側#表示行結尾
#,+#: 從左側#表示的行起始,加上右側#表示的行數
:2,+3 表示2到5行
.: 當前行
$: 最后一行
.,$-1 當前行到倒數第二行
%:全文,相當于1,$
/pat1/,/pat2/ 從第一次被pat1模式匹配到的行開始,一直到第一次被
pat2匹配到的行結束 #,/pat/ /pat/,$
使用方式:后跟一個編輯命令 d or y
w file: 將范圍內的行另存至指定文件中
r file:在指定位置插入指定文件中的所有內容
查找
/PATTERN:從當前光標所在處向文件尾部查找
?PATTERN:從當前光標所在處向文件首部查找
n:與命令同方向 N:與命令反方向
Esc鍵 退出當前模式
Esc鍵 Esc鍵 總是返回到命令模式
打開文件:
# vim [OPTION]… FILE…
+#: 打開文件后,直接讓光標處于第#行的行首
+/PATTERN:打開文件后,直接讓光標處于第一個被PATTERN匹配到的行的行首
vim + file 直接打開file,光標在最后一行
vim –b file 二進制方式打開文件
vim –d file1 file2… 比較多個文件
vim -m file 只讀打開文件
ex file 或 vim –e直接進入ex模式如果該文件存在,文件被打開并顯示內容如果該文件不存在,當編輯后第一次存盤時創建它
關閉文件:
擴展模式:
:q 退出
:q! 強制退出,丟棄做出的修改
:wq 保存退出
:x 保存退出
命令模式:
ZZ: 保存退出
ZQ:不保存退出
模式轉換:
插入模式 —-> 命令模式 ESC
命令模式 —-> 擴展模式 :
擴展模式 —-> 命令模式 ESC
鎖定和解鎖:CTRL+s,Ctrl+q
移動光標,進入插入模式
命令模式 –> 插入模式
i: insert, 在光標所在處輸入
I:在當前光標所在行的行首輸入
a: append, 在光標所在處后面輸入
A:在當前光標所在行的行尾輸入
o: 在當前光標所在行的下方打開一個新行
O:在當前光標所在行的上方打開一個新行
改變、刪除、復制文本
vim的功能:
塊選擇:
這個功能可以讓我們復制一個矩形區域的內容,十分方便。
v:字符選擇,會將光標經過的地方反白選擇;
V:行選擇;
Ctrl+v:塊選擇;
y:復制反白的地方;
d:刪除反白的地方。
vim的寄存器:
有26個命名寄存器和1個無命名寄存器,常存放不同的剪貼版內容,可以不同會話間共享。
用a,b,…,z表示,用“寄存器表示,放在數字和命令之間 如:3"tyy 表示復制3行到t寄存器中"tp表示將t寄存器內容粘貼
未指定,將使用無命名寄存器有10個數字寄存器,用0,1,…,9表示,0存放最近復制內容,1存放最近刪除內容。當新的文本變
更和刪除 時,1轉存到2,2轉存到3,以此類推。數字寄存器不能 在不同會話間共享。
編輯二進制文件:
以二進制方式打開文件 vim –b binaryfile
擴展命令模式下,利用xxd命令轉換為可讀的十六進制:%!xxd
擴展命令模式下,利用xxd命令轉換回二進制 :%!xxd –r
多文件模式:
vim FILE1 FILE2 FILE3 …
:next 下一個
:prev 前一個
:first 第一個
:last 最后一個
:wall 保存所有
:qall 退出所有
:wqall保存退出所有
使用多個“窗口”
多文件分割 vim -o|-O FILE1 FILE2 …
-o: 水平分割
-O: 垂直分割
在窗口間切換:Ctrl+w
單文件窗口分割:
Ctrl+w,s: split, 水平分割
Ctrl+w,v: vertical, 垂直分割
ctrl+w,q:取消相鄰窗口
ctrl+w,o:取消全部窗口
wqall 退出
vim環境設置:
需要注意的是,vim會將i我們的以前的行為都記錄下來,以方便我們操作。
vim常用的環境設置參數命令如下:
:set nu 設置行號
:set nonu 取消行號
:set hlsearch 設置高亮度查找
:set nohlsearch 取消高亮度查找
:set backup 自動備份文件
:set ruler 開啟右下角狀態欄說明
:set showmode 顯示左下角的INSERT之類的狀態欄
:set backspace={0,1,2} 設置退格鍵功能。為2時可以刪任意字符。為0或1時僅可以刪除剛才輸入的字符。
:set all 顯示目前所有的環境參數值
:set 顯示與系統默認值不同的參數值
:syntax on/off 是否開啟依據相關程序語法顯示不同的顏色
:set bg=dark/light 是否顯示不同的顏色色調
但是我們沒有必要每次使用vim都要重新設置一次各個參數值。我們可以通過配置文件來直接規定我們習慣的vim操作環境。整體vim的設置值一般是放在/etc/vimrc中的。我們一般不要修改這個文件。我們可以通過修改~/.vimrc這個文件。如果不存在,可以手動創建。
原創文章,作者:zanghonglei,如若轉載,請注明出處:http://www.www58058.com/32594