sed 高級編輯命令、模式空間、保持空間、vi 可視化模式、vimrc、地址定界
sed(stream deitor):行編輯器
【概述】sed是一種流式編輯器,它一次處理一行內容。處理時,把當前處理的行的所有內容存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,逐行處理,不修改文件。sed主要用于處理多個文件,簡化對文件的反復操作,編寫轉換程序等。
用法:sed 【option】… ‘script’ file…
【option】
-n:關閉模式空間內容的自動輸出,默認輸出全文包括修改的行,注意使用場合,如除了p命令外,需要顯示除了被匹配的模式外的內容時不用
-e:多點編輯,合并處理
-f /Path/file:從指定文件中讀取腳本,調用腳本,不用加引號
-r:支持擴展的正則表達式
-i:原處編輯,修改文件 sed -i.bak ‘3a\sss’ file #創建備份
【script】
地址定界:# #,# +# /pat1/,/pat2/ /^$/匹配多行的空行
~步進:1~2奇數行 2~2偶數行
【編輯命令】
p: 顯示模式空間中被修改的行
d: 刪除模式空間匹配的行
a \text:在行后面追加文本;支持使用\n實現多行追加
i\text:在行前面插入文本;支持使用\n實現多行插入
c \text:替換行為單行或多行文本
w /path/to/somefile: 保存模式匹配的行至指定文件
r /path/from/somefile:讀取指定文件的文本至模式空間中匹配到的行后
= 為模式空間中的行的下方打印行號
! 模式空間中匹配行取反處理
【查找與替換】
s/ / /:可用@、#代替 / 號
s/pattern/&new&/p:在查找內容追加,&代表pattern
g:行內全局替換
p:顯示替換成功的行
w /Path/to/where:替換成功的行保存至文件中
【命令操作】
sed -n ‘2,+2p’ file #2到4行的內容
sed -n ‘/abc/p’ file #包含abc的行
sed -n ‘2,/abc/p’ file #2到被模式匹配的行
sed ‘2i\s\nss’ file #2行后面插入多行
sed ‘2a\s\nss’ file #2行后面追加多行
sed ‘2c\word’ file #改變2行內容
sed -n ‘/abc/=’ file #顯示abc所在的行號,無內容
sed -n -e ‘/^abc/p’ -e ‘/^abc/=’ #顯示abc開頭的行號和內容
sed -n ‘/^$/=’ file #顯示空行行號
sed -n -e ‘/^$/p’ -e ‘/^$/=’ file #在空行下方行號
sed ‘/^$/d’ file #去除空行
sed ‘s/oldword/replace/g’ file #替換每一行中需要替換的內容
sed -n ‘s/root/&superman/p’ /etc/passwd #單詞后追加,顯示被修改的行
sed -n‘s/root/superman&/p’ /etc/passwd #單詞前追加
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets #顯示全文包括修改的行
sed -i.bak ‘s/dog/cat/g’ pets #創建備份文件,并修改文件內容
【高級編輯命令】
sed -n ‘n;p’ file #把模式空間中的內容覆蓋至保持空間中
sed ‘1!G;h;$!d’ file #除了第一行都覆蓋模式空間;覆蓋到保持空間;刪除模式空間行:倒序
sed ‘$!N;$!D’ file #讀兩行;刪除多行模式空間:最后兩行
sed ‘G’ file #追加單行模式空間:增加空行
sed ‘g’ file #覆蓋模式空間:替換空行
sed ‘/^$/d;G’ file #刪除空行;追加模式空間:兩空行
sed ‘n;d’ file #讀取下一行并覆蓋;刪除模式空間行(無-n顯示模式空間d刪除模式空間行就跳過了一行):顯示奇數行
sed -n ‘1!G;h:$p’ #除了第一行都覆蓋模式空間;覆蓋保持空間;顯示修改過程
【總結】:sed是流式的編輯器,每次讀取一行到模式空間再處理,因此不會對原文件操作。當模式空間的行被修改過可用p進行指定,-n關閉模式空間的自動打印,這樣就實現了特定的匹配;無-n與p就實現了模式空間內容全部打印,如使用d刪除某匹配的行再打印。除了模式空間sed還存在保持空間,通過高級編輯命令對模式空間與保持空間的覆蓋、追加、刪除等操作實現了較為復雜的文本處理如:文本倒序、郵件信息處理等等
vi(visual interface)編輯器
.swap文件
vi打開一個文件時會產生一個同名的.swap文件,時刻記錄用戶操作,正常退出則會刪除.swap文件。如果非正常退出則下次打開此文件時以readonly打開并出現上圖提示。可通過刪除swap文件或者在/etc/vimrc文件添加 set noswapfile
打開文件
vi +# file #定位
vi + file #最后一行
vi +/pattern file #定位到第一個模式所在行
vi -b hexfile #hex文件
vi -d file1 file2 #比較打開多個文件,高亮顯示不同處
vi -m file #只讀方式打開
gf #打開光標處文件名的文件,如main.c
ctrl ^ #切換到上次打開的文件。等于 :first
三種模式及轉換
命令模式(command mode)
(默認):主要是查看文件內容,控制屏幕光標的移動,字符、字或行的刪除,移動復制某區段及進入Insert mode下,或者到external mode
ctrl s | ctrl q #鎖定了,無反應,q解鎖
shift ~ #小寫變大寫,小寫變大寫
shift # #高亮向上找當前光標相同的單詞
shift * #高亮向下找相同單詞,noh取消高亮
shift zz #(ZZ)保存并退出,ZQ不保存退出
翻頁(屏幕):ctrl d(下半) ctrl u(上半) ctrl f(下一屏) ctrl b(上一屏) PgUP
翻頁(光標):zt(光標行滾動到第一行) zz(光標行滾中間) zb(光標行滾底- 端) #zt(第#行滾到第一行) #zz #zb
單詞跳轉:w下首 e下尾 b當前、上首
光標移動:arrow j、k、h、l
光標定位(行內):0 ^ $
光標定位(配對):% #跳轉到匹配的) ] }
光標定位(行內字符):f_(定位到本行第一個) F(往前定位到_)
光標定位(全文):#G(第#行) gg(第1行) G(末行) H\M\L(當前屏的第一行個、中間、最后一行的第一個位置)
光標定位(句子):shift( #上一句 shift ) #下一句
光標定位(屏幕行):g(arrow j k ^ $) #當句子太長時,屏幕行非常方便
光標定位(段落):shift } #下一段 shift } #下一段
光標定位(函數): [[ #上一個函數 ]] #下一個函數
光標書簽設置及跳轉:m a-z #設置光標書簽,用26個字母表示 ` a-z 跳轉到書簽
增加縮進:可配合可視化選擇 >增加縮進 <減少縮進
刪除命令:d(^ $ 0 w e b ( { ) } gg 1G G)解釋一下(行第一個可見字符、行尾、行首、下一個單詞首、下一個單詞尾、當前或上一個單詞首、上一句、上一段、下一句、下一段、文首、文末) dd(刪除當前行) D(刪除之行尾)=d$
剪切命令:x(單個字符) #x(光標開始#個字符) xp(交換當前x內容到下一個字符之后)
刪除、剪切、改變命令,存放在數字1寄存器中
替換字符:R(整行) r(單個字符)
復制命令:y(^ $ 0 w e b ( { ) } gg 1G G)
粘貼命令:p光標之后 P光標之前(粘貼單詞時用P從行首復制,單詞完整)
配對的符號操作:先進入該配對符號中再執行以下命令
更改內容:ci【’ ” ( { [ <】
刪除內容:di【’ ” ( { [ <】
復制內容:yi【’ ” ( { [ <】
選中內容:vi【’ ” ( { [ <】
命令模式輸入數字,進入插入模式輸入字符,ESC…… #重復n次輸入
# y|d|gU|gu #如0y$ 表示從本行開頭到末尾的復制,gU變大寫,gu變小寫
u撤銷 ctrl r重做 #u撤銷#次
U撤銷光標落在這行后所有對此行的更改
插入模式(insert mode)
:vi被運行時,通常處在命令模式下,鍵入以下命令可以使vi退出命令模式,進入插入模式(命令模式 ——> 插入模式):
I(i)行首與當前位置、A(a)行尾與當前位置、O(o)上行與下行
S #刪除一行并進入insert模式
s #刪除當前光標字母進入insert模式
數字 s (arrow h、j、k、l)刪除光標之后的#個字母
cc #刪除一行并進入insert模式
改變字符:c($ ^ 0 c w e b ( { ) } gg 1G G) 數字 c(arrow 、h、j、k、l) #刪除并進入插入模式
擴展模式
(external command):ex file 或 vi -e 直接進入ex模式??蓪⑽募4婊蛲顺鰒i,也可以設置編輯環境,如尋找字符串、列出行號……不過一般我們在使用時把vi簡化成兩個模式,就是將擴展模式(external mode)也算入命令行模式(command mode)
:wq : x ZZ
:r file
:w filename #另存為
!command #執行命令
r!command #讀入命令的結果
:# #第幾行
【地址定界】
start_pos,end_pos
使用方式:后跟一個編輯命令d、y、w newfile(可 >> 追加至文件)、r file
# #具體行
#,+# #從前面的#行再加#行的范圍
. #當前行
% #全文,相當于 1,$
/pattern/,/pattern/ #模式匹配,從第一次被匹配到的行到pattern2被匹配的行
#,/pattern/ #模式匹配,從#行到pattern被匹配到的行
/pattern/,$ #從/pattern/到文末的行
【查找】
/pattern #向下查找 n N
/?pattern #向上查找 N n
【查找并替換】
s/find/replace/修飾符
i:忽略大小寫
g:全局替換,默認是替換每行第一次出現的
gc:全局替換,加提示
@、#代替分割符/ ,避免多次使用轉義
vim的寄存器
a-z,A-Z寄存器,0-9數字寄存器,”未命名寄存器(不指定時默認的register),-短刪除寄存器
命名寄存器:#”f yy表示復制#行到f寄存器中;而 “fp表示讀取粘貼;擴展模式:#put f 放置f寄存器內容到第5行
數字寄存器,0存放最近復制的內容,1存放最近的刪除內容。當新的文本變更和刪除時,1轉存到2,2到3……不同會話不能共享內容
查看寄存器內容在擴展模式 :register f #顯示寄存器內容
vim編輯二進制文件
vim -b binfile #打開二進制文件
在擴展命令模式下,利用 :%!xxd 轉換打開的2進制文件為16進制可讀文件,修改之后 :%!xxd -r返回再退出
可視化模式
v #字符可視化模式(characterwise visual mode),選擇的單位是字符
gv #選中上次可視化模式時選擇的文本
V #行可視化模式(Linewise visual mode),選擇的單位是行
Ctrl V #塊可視化模式(Blockwise visual mode),選擇單位是塊
切換可視化模式:在命令模式下v或V或ctrl v進入可視化模式,在v可視化模式ctrl v- 進入塊可視化,Esc等待1秒退出
在可視化模式下編輯:在可視化模式下可完成刪除、復制、~大小寫轉換、>增加縮進、J合并為一行、w newfile另存為、sort排序
vim 多個窗口
vim file1 file2 file3多文件模式
:next :prev :first :last ctrl ^
:wall :qall :wqall
多個文件分割
vim -(O)o file1 file2……
ctrl w + arrow
單個文件分割
ctrl w+s #水平分割多次
ctrl w+v #垂直分割多次
ctrl w+q #取消相鄰的,ctrl w+o取消其他所有的
vim配置文件
個人:~/.vimrc #默認不存在的配置文件,打開vim時自動加載
全局:/etc/vimrc
設置vim的工作特性
行號:set【nu(number),nonu】
括號匹配:set【sm(showmatch),nosm】
自動縮進:set【ai,noai】
高亮搜索:set【hlsearch,nohlsearch】,取消也可以noh
語法高亮:【syntax on,syntax off】
忽略大小寫:set【ic,noic】
文件格式:【fileformat=nuix,fileformat=dos】
文本寬度:set【textwidth=65,wrapmargin=15】
自動縮進寬度:set【shiftwidth=4】
拼寫檢查:set 【spell,nospell】
:h(help)
:set (set all) #全部set topic
:h topic
vimtutor #tutor
練習
原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/33085