linux溫故知新九

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開頭的行號和內容

wKiom1gcMlDir-89AAAYuYTJ8Ik681.png-wh_50

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還存在保持空間,通過高級編輯命令對模式空間與保持空間的覆蓋、追加、刪除等操作實現了較爲複雜的文本處理如:文本倒序、郵件信息處理等等


wKiom1gcOs-REbyCAAJNW3qfhdY297.png-wh_50


打開文件 

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模式。可將文件保存或退出vi,也可以設置編輯環境,如尋找字符串、列出行號……不過一般我們在使用時把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),-短刪除寄存器 


wKioL1gcO2uT8HnnAAHPLwtQv1I902.png-wh_50

命名寄存器:#”f yy表示複製#行到f寄存器中;而 “fp表示讀取粘貼;擴展模式:#put f 放置f寄存器內容到第5行

數字寄存器,0存放最近複製的內容,1存放最近的刪除內容。當新的文本變更和刪除時,1轉存到2,2到3……不同會話不能共享內容

查看寄存器內容在擴展模式 :register f #顯示寄存器內容 


wKiom1gcO7qju8ZrAABLglI1rFo356.png-wh_50


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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章