sed與vim淺析

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

000.png

移動光標,進入插入模式

    命令模式 –> 插入模式

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

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

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

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

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

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

111.png

改變、刪除、復制文本

222.png

vim的功能:

    塊選擇:

    這個功能可以讓我們復制一個矩形區域的內容,十分方便。

    v:字符選擇,會將光標經過的地方反白選擇;

    V:行選擇;

    Ctrl+v:塊選擇;

    y:復制反白的地方;

    d:刪除反白的地方。

444.png

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

(0)
zanghongleizanghonglei
上一篇 2016-08-10
下一篇 2016-08-10

相關推薦

  • 軟件包管理(rpm,yum,源碼安裝)

    API:Application Programming Interface  ==>軟件開發接口     POSIX :Portable OS 程序源代碼 –> 預處理 –> 編譯 –> 匯編 –>鏈接   &n…

    Linux干貨 2016-08-24
  • scp命令

    scp命令: 基于ssh連接完成復制   scp? [options]? SRC…? DEST/ scp? [options]? SRC? DEST   存在兩種使用情形: PULL獲?。? scp? [options]? [user@]host:/PATH/TO/SOMEFILE?? /PATH/TO/SOMEFILE PU…

    Linux干貨 2017-10-21
  • Linux的自動化安裝實現

    在介紹自動化安裝系統之前讓我們來回顧一下系統的啟動流程,系統的啟動大概分為一下幾個步驟:加電自檢 boot sequence(mbr)— boot loader –>kernel(initramfs)—>rootfs  /sbin/init大概就是這么幾個過程了,接下來來介紹系統的安裝,安裝系統雖然看起來簡單,普…

    系統運維 2016-09-19
  • MySQL系列之一鍵安裝腳本—-單實例/多實例

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1440414       最近在搞MySQL,由于經常測試一些東西。因此,就寫了一個一鍵安裝腳本。 腳本用途: 用于在…

    Linux干貨 2016-08-15
  • grub詳解

    #GRUB詳解 grub基礎概念 前面的開機過程我們知道:按照BIOS定義的硬件設備啟動順序,第一啟動設備中的MBR去讀取boot loader。boot loader功能很強大,要重新自檢硬件設備,開始有一個菜單供用戶選擇系統或者內核版本,還要加載內核將內核解壓到RAM中并執行,最后將控制權移交給內核。屈屈446個字節怎么讓它完成那么多功能。所以Linux…

    Linux干貨 2016-11-25
  • 關于大型網站技術演進的思考(一):存儲的瓶頸(1)

    原文出處: 夏天的森林  前不久公司請來了位互聯網界的技術大牛跟我們做了一次大型網站架構的培訓,兩天12個小時信息量非常大,知識的廣度和難度也非常大,培訓完后我很難完整理出全部聽到的知識,今天我換了個思路是回味這次培訓,這個思路就是通過本人目前的經驗和技術水平來思考下大型網站技術演進的過程。 首先我們要思考一個問題,什么樣的網站才是大型網…

    Linux干貨 2015-02-26
欧美性久久久久