【轉】Ubuntu下使用sed命令處理文本


  【轉】原文鏈接:http://blog.csdn.net/u011534057/article/details/58139769 【侵刪】

  

  先舉個簡單的例子:

  有個文件叫example.txt

  內容為 aaa 

  使用sed命令刪除第一行

  sed '$d' example.txt > example.txt

  那么第一行就會被刪除了    



   現在需要對txt文件的每行行首加上絕對路徑,一開始編寫的shell腳本,提示更改成功了,但不知道還要將輸出進行重定向,於是換了vim打開文件進行修改。

  1、首先,因為絕對路徑里包含/這樣的字符,可以使用\進行轉義,假定要修改的文件名為test.txt,要在行首加入字符/finetune_caviar/,shell腳本編寫如下:

  sed 's/^/\/finetune_caviar\/&/g' test.txt

  介紹下該命令:

  (1)sed是一個很好的文件處理工具,本身是一個管道命令,主要是以行為單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作,命令格式為:sed [-nefri] ‘command’ 文本名稱

  (2)^表示行首

  (3)\/表示使用\對字符/進行轉義

  (4)g代表將每行出現的字符全部替換,如果想在特定字符處添加,g就有用了,否則只會替換每行第一個,而不繼續往后找了;

  2、但是我在執行過上述命令后,只是進行了屏幕輸出,於是換成vim進行修改:

         使用vim test.txt打開文件后,使用冒號(:)輸入命令:%s/^/\/finetune_caviar\/&/g

         注:因為在文本編輯模式里不需要使用sed命令,也不需要指明文件名稱,自然表示命令的' '也是不需要的了。如果不加上%,則只對第一行進行替換。

  3、將行首內容/finetune_caviar/替換為finetune:

        shell腳本:sed “s/\/finetune_caviar\//\/finetune\//” test.txt > test_new.txt (此時不止進行了屏幕輸出,同時保存了更新過的文件為test_new.txt)

        vim編輯:%s/\/finetune_caviar\//\/finetune\// ,或者g/\/finetune_caviar\//s//\/finetune\//

  4、附sed的常用命令:

  常用選項:
          -n∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。但如果加上 -n 參數后,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
          -e∶直接在指令列模式上進行 sed 的動作編輯;
          -f∶直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的sed 動作;
          -r∶sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
          -i∶直接修改讀取的檔案內容,而不是由螢幕輸出。       

  常用命令:
          a   ∶新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
          c   ∶取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
          d   ∶刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚;
           i   ∶插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行);
           p  ∶列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
           s  ∶取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

  舉例:(假設我們有一文件名為ab)
       (1)刪除某行
       [root@localhost ruby]# sed '1d' ab              #刪除第一行 
       [root@localhost ruby] # sed '$d' ab              #刪除最后一行
       [root@localhost ruby] # sed '1,2d' ab           #刪除第一行到第二行
       [root@localhost ruby] # sed '2,$d' ab           #刪除第二行到最后一行

   (2)顯示某行
.      [root@localhost ruby]# sed -n '1p' ab           #顯示第一行 
       [root@localhost ruby] # sed -n '$p' ab           #顯示最后一行
       [root@localhost ruby] # sed -n '1,2p' ab        #顯示第一行到第二行
       [root@localhost ruby] # sed -n '2,$p' ab        #顯示第二行到最后一行

   (3)使用模式進行查詢
       [root@localhost ruby] # sed -n '/ruby/p' ab    #查詢包括關鍵字ruby所在所有行
       [root@localhost ruby] # sed -n '/\$/p' ab        #查詢包括關鍵字$所在所有行,使用反斜線\屏蔽特殊含義

   (4)增加一行或多行字符串
       [root@localhost ruby]# cat ab
       Hello!
       ruby is me,welcome to my blog.
       end
       [root@localhost ruby] # sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
       Hello!
       drink tea
       ruby is me,welcome to my blog. 
       end
       [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
       Hello!
       drink tea
       ruby is me,welcome to my blog.
       drink tea
       end
       drink tea
       [root@localhost ruby] # sed '1a drink tea\nor coffee' ab  #第一行后增加多行,使用換行符\n
       Hello!
       drink tea
       or coffee
       ruby is me,welcome to my blog.
       end

   (5)代替一行或多行
       [root@localhost ruby] # sed '1c Hi' ab               #第一行代替為Hi
       Hi
       ruby is me,welcome to my blog.
       end
       [root@localhost ruby] # sed '1,2c Hi' ab            #第一行到第二行代替為Hi
       Hi
       end

       sed 's/^/添加的頭部&/g'   //在所有行首添加
       sed 's/$/&添加的尾部/g'    //在所有行末添加
       sed '2s/原字符串/替換字符串/g'    //替換第2行
       sed '$s/原字符串/替換字符串/g'    //替換最后一行
       sed '2,5s/原字符串/替換字符串/g'    //替換2到5行
       sed '2,$s/原字符串/替換字符串/g'    //替換2到最后一行

       sed '.,$s/原字符串/替換字符串/g'    //替換當前行到最后一行

   (6)替換一行中的某部分
    格式:sed 's/要替換的字符串/新的字符串/g'   (要替換的字符串可以用正則表達式,末尾加g替換每一個匹配的關鍵字,否則只替換每行的第一個)
       sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替換ruby為bird
    sed -n '/ruby/p' ab | sed 's/ruby//g'        #刪除ruby

       替換樣式可以多個在同一條命令中執行,用分號”;”分隔:

       sed 's/^/添加的頭部&/g;s/$/&添加的尾部/g'    //同時執行兩個替換規則

       (7)插入
      sed -i '$a bye' ab        #在文件ab中最后一行直接輸入"bye"
      sed -i '1i'$first ab#在文件ab中第一行插入變量$first作為一行,這里注意1和i之間可以有空格,但是$first前不能有空格

       (8)刪除匹配行

        sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是變量,則需要“”,而不是‘’。記得好像是)

       (9) 替換匹配行中的某個字符串:

        sed -i '/匹配字符串/s/替換源字符串/替換目標字符串/g' filename

       (10)sed處理過的輸出是直接輸出到屏幕上的,要保存可以將輸出重定向,或者使用參數”i”直接在文件中替換:

        sed -i 's/原字符串/替換字符串/g' filename    //替換文件中的所有匹配項

        注:為了避免/的歧義。可以使用?、#、+等其他字符來代替/作為命令的分隔符。

  5、附vim常用命令


  光標控制命令 

    命令                  移動
     k                 向上移一行
     j                  向下移一行
     h                向左移一個字符
     l                  向右移一個字符
     gg              移到文件的首行
     G                 移到文件的末行
     H                 移到屏幕的第一行
     w                 移到下一個字的開頭
     W                移到下一個字的開頭,忽略標點符號
     e                 移到下一個字的結尾
     E                移到下一個字的結尾,忽略標點符號
     ^                移到當前行首
     $                移到當前行尾
     {                  移到上一段開頭
     }                  移到上一段結尾
     Enter          移到下一行行首

   在 vim 中添加文本
     命令                  插入
     i                  在光標前插入文本
     I                  在當前行首插入文本
     a                 在光標后插入文本
     A                在當前行末插入文本
     o                 在當前行的下邊插入新行
     O                在當前行的上邊插入新行
     s                  刪除光標所在處字符,並進入插入模式
     S                 刪除光標所在的行,並進入插入模式
     :r filename       讀入指定文件內容,並插在當前行后
     :nrfile                讀入文件 file 內容,並插在第 n 行后
     Esc                  回到命令模式

  在 vim 中刪除文本
      命令                  刪除
      x                  刪除光標處的字符
      db               刪除光標前面的字
      dw               刪至下一個字的開頭
      dd               刪除整行
      :n,md          從第 m 行開始往前刪除 n 行
      d$                從光標處刪除到行尾
      d^                從光標處刪除到行首

  在 vim 中查找與替換
      命令                 查找與替換
    /target             在文件中向前查找 target
    ?target            在文件中向后查找 target
      n                   查找下一個
      N                   查找上一個
    :setic               查找時忽略大小寫
    :setnoic          查找時對大小寫敏感
  %s/text1/text2/g       在整個文件中查找text1並且替換為text2

  在 vim 中復制文本
      命令                     復制
      yy                復制當前行
      nyy              從當前開始復制n行
       p                  粘貼至光標前
       P                  粘貼至光標后
      u                  撤消上一次修改
       U                  撤消所有修改

  保存與退出vim
      命令                     保存或退出
      :w                  保存文件但不退出
      :wfile             將修改保存在 file 中但不退出
    :wq 或 ZZ或:x        保存文件並退出
      :q!                 不保存文件,強制退出
      :e!                  放棄所有修改,從上次保存文件開始再編輯

  其他選項
      選項                     作用
      :setall            查看所有選項
      :setnu            設置行號
      :setshowmode       顯示是輸入模式還是替換模式
      :set ts=4                 為文本輸入設置 tab stops
      :setnonumber        取消顯示行數
      :.=                 查看當前行的行號
      :=                  查看總行數
      ctrl+g            顯示文件名、當前的行號、文件的總行數和文件位置的百分比


    參考:http://www.jb51.net/LINUXjishu/155122.html

                http://blog.sina.com.cn/s/blog_4ce89f200100vkb5.html

                http://www.cnblogs.com/afant/archive/2009/03/11/1408745.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM