sed 和 vim的用法

處理文本的工具 三劍客之 sed


sed是一種流編輯器,它一次處理一行內容。處理時,把 當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”( pattern space),接着用sed命令處理緩衝區中的內容 ,處理完成後,把緩衝區的內容送往屏幕。接着處理下一 行,這樣不斷重複,直到文件末尾。文件內容並沒有改變 ,除非你使用重定向存儲輸出。Sed主要用來自動編輯一 個或多個文件,簡化對文件的反覆操作,編寫轉換程序等


sed 的 用法


sed [option]... 'script' inputfile...  

常用選項: 

-n:不輸出模式空間內容的自動打印 

-e: 多點編輯 

-f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本 

-r: 支持使用擴展正則表達式 

-i: 原處編輯 script: '地址命令'


關於地址界定 有以下幾種 表現方式


(1) 不給地址:對全文進行處理 

(2) 單地址: #: 指定的行 /pattern/:被此處模式所能夠匹配到的每一行 

(3) 地址範圍: #,# #,+# /pat1/,/pat2/ #,/pat1/ 

(4) ~:步進 1~2 奇數行 2~2 偶數行


擴展模式的地址定界


:start_pos,end_pos 

#: 具體第#行,例如2表示第2行; 

#,#: 從左側#表示行起始,到右側#表示行結尾 #,

+#: 從左側#表示的行起始,加上右側#表示的行數 

:2,+3  表示2到5行 

.: 當前行 $: 最後一行 

.,$-1 當前行到倒數第二行 

%:全文, 相當於1,$


/pat1/,/pat2/ 從第一次被pat1模式匹配到的行開始,一直到第一次被 pat2匹配到的行結束 

#,/pat/ 

/pat/,$  

使用方式:後跟一個編輯命令 

w file: 將範圍內的行另存至指定文件中 

r  file:在指定位置插入指定文件中的所有內容



sed 的 編輯命令選項有:


d: 刪除模式空間匹配的行 

p: 顯示模式空間中的內容 

a:\text:在行後面追加文本;支持使用\n實現多行追加 

i: \text:在行前面插入文本;支持使用\n實現多行插入 

c: \text:替換行爲單行或多行文本 

w: /path/to/somefile: 保存模式匹配的行至指定文件 

r: /path/from/somefile:讀取指定文件的文本至模式空 間中匹配到的行後 

=: 爲模式空間中的行打印行號 

!: 模式空間中匹配行取反處理


sed 的查找替換模式


s///:查找替換,支持使用其它分隔符,s@@@,s### 替換標記: 


g: 行內全局替換 

p: 顯示替換成功的行 

w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中


sed高級編輯命令


h: 把模式空間中的內容覆蓋至保持空間中 

H:把模式空間中的內容追加至保持空間中 

g: 從保持空間取出數據覆蓋至模式空間 

G:從保持空間取出內容追加至模式空間 

x: 把模式空間中的內容與保持空間中的內容進行互換 

n: 讀取匹配到的行的下一行覆蓋至模式空間 

N:追加匹配到的行的下一行至模式空間 

d: 刪除模式空間中的行 

D:刪除當前模式空間開端至\n的內容(不在傳至標準輸 出),放棄之後的命令,但是對剩餘模式空間重新執行sed


sed高級編輯命令的一些示例


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



vim 文本編輯器


vim的 特點以及難點在於 三種模式之間的轉換 和三種模式中的 命令選項


vim的三種主要模式: 命令模式(默認):移動光標,剪切/粘貼文本 插入(編輯)模式:修改文本 擴展命令模式:保存,退出等 


三種模式之間的切換分別爲


插入模式 ----> 命令模式 ESC  

命令模式 ----> 擴展模式 :  

擴展模式 ----> 命令模式 ESC  

鎖定和解鎖:CTRL+s,Ctrl+q


第一種命令模式


# vim [OPTION]... FILE... 

  +#: 打開文件後,直接讓光標處於第#行的行首 

  +/PATTERN:打開文件後,直接讓光標處於第一個被 PATTERN匹配到的行的行首 

  vim + file 直接打開file,光標在最後一行 

  vim –b file 二進制方式打開文件 

  vim –d file1 file2…  比較多個文件 

  vim  -m file  只讀打開文件

  ex  file 或 vim –e  直接進入ex模式 如果該文件存在,文件被打開並顯示內容 如果該文件不存在,當編輯後第一次存盤時創建它


第二種插入模式


命令模式 --> 插入模式 

  i: insert, 在光標所在處輸入 

  I:在當前光標所在行的行首輸入 

  a: append, 在光標所在處後面輸入 

  A:在當前光標所在行的行尾輸入 

  o: 在當前光標所在行的下方打開一個新行 

  O:在當前光標所在行的上方打開一個新行


第三種擴展命令模式


按“:”進入Ex模式 創建一個命令提示符:,處於底部的屏幕左側  

命令: 

 w 寫(存)磁盤文件 

 wq 寫入並退出 

 q  退出 

 q! 不存盤退出,即使更改都將丟失

 r filename 讀文件內容到當前文件中 

 w  filename  將當前文件內容寫入另一個文件 !command r!command


 命令模式下的光標跳轉

 字符間跳轉: 

   h: 左 

   l: 右 

   j: 下 

   k: 上 

   #COMMAND:跳轉由#指定的個數的字符;  

 單詞間跳轉: 

  w:下一個單詞的詞首 

  e:當前或下一單詞的詞尾 

  b:當前或前一個單詞的詞首 

   #COMMAND:由#指定一次跳轉的單詞數  

 當前頁跳轉: 

  H:頁首 

  M:頁中間行 

  L:頁底


 行首行尾跳轉: ^: 跳轉至行首的第一個非空白字符; 

  0: 跳轉至行首 

  $: 跳轉至行尾  

 行間移動: #G、

 擴展模式:# :跳轉至由#指定行 

  G:最後一行 

  1G, gg: 第一行  

 句間移動: 

  ):下一句 

  (:上一句  

 段落間移動: 

  }:下一段 

  {:上一段


翻屏操作


 Ctrl+f: 向文件尾部翻一屏

 Ctrl+b: 向文件首部翻一屏

 Ctrl+d: 向文件尾部翻半屏

 Ctrl+u:向文件首部翻半屏


關閉文件


擴展模式: 

  :q 退出 

  :q! 強制退出,丟棄做出的修改 

  :wq 保存退出 

  :x 保存退出  


命令模式 

  ZZ: 保存退出 

  ZQ:不保存退出


命令模式操作下的粘貼 複製 刪除 替換 修改


字符編輯之刪除和替換


字符編輯: 

  x: 刪除光標處的字符; 

  #x: 刪除光標處起始的#個字符 

  xp: 交換光標所在處的字符及其後面字符的位置 

  ~:轉換大小寫


刪除命令: 

  d: 刪除命令,可結合光標跳轉字符,實現範圍刪除; 

  d$: 刪除到行尾 d^:刪除到非空行首 

  d0:刪除到行首 dw: 

  de: 

  db: #COMMAND

  dd: 刪除光標所在的行 #dd:多行刪除

  D:從當前光標位置一直刪除到行尾,留空行,等同於d$

 

替換命令(r, replace) 

  r: 替換光標所在處的字符 

  R:切換成REPLACE模式


編輯之複製命令


複製命令(y, yank): 

  y: 複製,行爲相似於d命令 

  y$ 

  y0 

  y^ 

  ye 

  yw 

  yb 

  #COMMAND

  yy:複製行 

  #yy: 複製多行

  Y: 複製整行


編輯之粘貼


粘貼命令(p, paste): 

  p:緩衝區存的如果爲整行,則粘貼當前光標所在行的下 方;否則,則粘貼至當前光標所在處的後面 P:緩衝區存的如果爲整行,則粘貼當前光標所在行的上 方;否則,則粘貼至當前光標所在處的前面


編輯之修改


改變命令(c, change) 


c: 修改後切換成插入模式  

命令模式 --> 插入模式 

  c$ 

  c^ 

  c0 

  cb 

  ce 

  cw 

  #COMMAND  

  cc:刪除當前行並輸入新內容 

  #cc:  

  C:刪除當前光標到行尾,並切換成插入模式


Command: y 複製、d 刪除、gU 變大寫、gu 變小寫 



擴展模式下的查找與替換



查找 

/PATTERN:從當前光標所在處向文件尾部查找 

?PATTERN:從當前光標所在處向文件首部查找 

n:與命令同方向 

N:與命令反方向


s: 在擴展模式下完成查找替換操作 


格式:

s/要查找的內容/替換爲的內容/修飾符 

要查找的內容:可使用模式 

替換爲的內容:不能使用模式,但可以使用\1, \2, ... 等後向引用符號;還可以使用“&”引用前面查找時查找到的整 個內容 

修飾符: 

   i: 忽略大小寫 

   g: 全局替換;默認情況下,每一行只替換第一次出現 

   gc:全局替換,每次替換前詢問 查找替換中的分隔符/可替換爲其它字符,

   例如 s@/etc@/var@g s#/boot#/#i


命令模式的撤銷和更改


  1 u撤銷最近的更改

  2 #u撤銷之前多次更改

  3 U 撤消光標落在這行後所有此行的更改  

  4 按Ctrl - r重做最後的“撤消”更改

  5 . 重複前一個操作

  6 n.重複前一個操作n次



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的可視化模式


允許選擇的文本塊 

v 面向字符 

V 面向行 

ctrl-v 面向塊  

可視化鍵可用於與移動鍵結合使用: w, ) , } ,箭頭等  

突出顯示的文字可以被刪除,複製,變更,過濾,搜索/替換 等


多文件多窗口模式


vim FILE1 FILE2 FILE3 ... 

  :next 下一個 

  :prev 前一個 

  :first 第一個 

  :last 最後一個 

  :wall 保存所有 

  :qall 退出所有 

  :wqall


 多文件分割 vim -o|-O FILE1 FILE2 ... 

   1 -o: 水平分割 

   2 -O: 垂直分割 在窗口間切換:Ctrl+w, Arrow  


 單文件窗口分割: 

   1 Ctrl+w,s: split, 水平分割 

   2 Ctrl+w,v: vertical, 垂直分割 

   3 ctrl+w,q:取消相鄰窗口 

   4 ctrl+w,o:取消全部窗口 

   5 :wqall 退出


 vim的 私人訂製


 配置文件:永久有效 

   全局:/etc/vimrc 

   個人:~/.vimrc  

 擴展模式:當前vim進程有效

   (1) 行號 顯示:set number, 簡寫爲set nu 取消顯示:set nonumber, 簡寫爲set nonu

   (2) 括號成對匹配 匹配:set showmatch, 簡寫爲set sm 取消:set nosm

   (3) 自動縮進 啓用:set ai 禁用:set noai

   (4) 高亮搜索 啓用:set hlsearch 禁用:set nohlsearch

   (5) 語法高亮 啓用:syntax on 禁用:syntax off

   (6) 忽略字符的大小寫 啓用:set ic 不忽略:set noic

   (7) 文件格式 啓用:fileformat=unix 不忽略: fileformat=dos (8) 設置文本寬度 :set textwidth=65 (vim only) :set wrapmargin=15 :help option-list :set or :set all

   


   vim的內置幫助的文檔


   vi/vim內置幫助 :help :help topic Use :q to exit help Vimtutor





   作業


1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符


                1 sed   's/^[[:space:]]+//' /etc/grub.conf 

               

1電腦演示

[root@localhost tmp]# sed 's/^[[:space:]]\+//' /etc/grub.conf

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE:  You have a /boot partition.  This means that

#          all kernel and initrd paths are relative to /boot/, eg.

#          root (hd0,0)

#          kernel /vmlinuz-version ro root=/dev/sda2

#          initrd /initrd-[generic-]version.img

#boot=/dev/sda

default=0

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS 6 (2.6.32-642.el6.x86_64)

root (hd0,0)

kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=d496e55b-f1c4-4267-b357-cdd06fa77352 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

initrd /initramfs-2.6.32-642.el6.x86_64.img

[root@localhost tmp]# 






2、刪除/etc/fstab文件中所有以#開頭,後面至少跟一個空白字符的行的行首的#和空白字符

               1 sed 's/^#[[:space:]]\+//' /etc/fstab

               2 sed -r 's/^(#|[[:space:]]+)//' /etc/fstab


1電腦演示

[root@localhost tmp]# sed 's/^#[[:space:]]\+//' /etc/fstab 


#

/etc/fstab

Created by anaconda on Tue Jul 19 20:14:32 2016

#

Accessible filesystems, by reference, are maintained under '/dev/disk'

See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=d496e55b-f1c4-4267-b357-cdd06fa77352 /                       ext4    defaults        1 1

UUID=a142fc0a-a404-49c7-a4a2-494c867ec71c /boot                   ext4    defaults        1 2

UUID=cd32c025-5104-4670-bab4-e5db886ed7b9 /testdir                ext4    defaults        1 2

UUID=84187402-904e-4673-81cd-3228183a2437 swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/cdrom /mnt iso9660 defaults 0 0

[root@localhost tmp]# 





3、在/root/install.log每一行行首增加#號

              1  sed 's/^/#&/' /root/install.log


1電腦演示

[root@localhost tmp]# sed 's/^/#&/' /root/install.log

#{

#333

#anaconda-ks.cfg

#Desktop

#Documents

#Downloads

#f1

#f22

#f99

#f[a,b,c,d,e,f]

#history.log

#install.log

#install.log.syslog

#Music

#nusers

#Pictures

#Public

#Templates

#Videos

[root@localhost tmp]# 







4、在/etc/fstab文件中不以#開頭的行的行首增加#號

1 sed 's/^[^#]/#&/' /etc/fstab

1電腦演示

[root@localhost tmp]# sed 's/^[^#]/#&/' /etc/fstab 


#

# /etc/fstab

# Created by anaconda on Tue Jul 19 20:14:32 2016

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

#UUID=d496e55b-f1c4-4267-b357-cdd06fa77352 /                       ext4    defaults        1 1

#UUID=a142fc0a-a404-49c7-a4a2-494c867ec71c /boot                   ext4    defaults        1 2

#UUID=cd32c025-5104-4670-bab4-e5db886ed7b9 /testdir                ext4    defaults        1 2

#UUID=84187402-904e-4673-81cd-3228183a2437 swap                    swap    defaults        0 0

#tmpfs                   /dev/shm                tmpfs   defaults        0 0

#devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

#sysfs                   /sys                    sysfs   defaults        0 0

#proc                    /proc                   proc    defaults        0 0

#/dev/cdrom /mnt iso9660 defaults 0 0

[root@localhost tmp]# 






5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名

1 echo "/etc/sysconfig/network-scripts/" | sed -r 's@(.*/)([^/]+/?)$@\1@'


2 echo "/etc/fst/sd" | sed -r  's@(.*)/([^/]+/?)@\2@'


3 echo "/etc/fst/sd" | sed   -r 's@(.*/)([^/]+/?)$@\1@' 


3電腦演示

[root@localhost tmp]# echo "/etc/fst/sd" | sed -r 's@(.*/)([^/]+/?)$@\1@'

/etc/fst/

[root@localhost tmp]# echo "/etc/fst/sd" | sed -r 's@(.*/)([^/]+/?)$@\2@'

sd

[root@localhost tmp]# 







6、利用sed 取出ifconfig命令中本機的IPv4地址

1 ifconfig | sed '2!d' | sed  -r 's@.*inet.addr:(.*)B.*@\1@'   [! 取反]


1電腦演示

[root@localhost tmp]# ifconfig | sed '2!d' | sed  -r 's@.*inet.addr:(.*)B.*@\1@'

172.18.16.71  

[root@localhost tmp]# 





7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重複次數


1 ls /mnt/Packages/* | sed -r 's@.*\.(.*)\.rpm$@\1@' | sort | uniq -c


2 ls /run/media/root/centos |sed 's@\.rpm@@' | sed 's@.*\.@@' |sort|uniq -c


3 ls *.rpm |rev|cut -d. -f2 |rev|sort|uniq -c


1電腦演示


 [root@localhost tmp]# ls /mnt/Packages/* | sed -r 's@.*\.(.*)\.rpm$@\1@' | sort | uniq -c

      4 i686

      1 /mnt/Packages/TRANS.TBL

    919 noarch

   2283 x86_64

[root@localhost tmp]# 


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