文本處理三劍客之Sed(行編輯器)

sed(流編輯器,行編輯器)

    是一種流編輯器,一次處理一行內容,處理時把當前處理的行存儲在臨時緩存中,成為“模式空間”,接著用sed命令處理緩沖區的內容,處理完畢后吧緩沖區內容輸出到屏幕接著處理下一行。這樣不斷重復到末尾。文件內容并沒有改變。除非使用重定向輸出才會改變內容。

sed:行編輯器(全屏編輯器:vi)

    \\把制定行提取到內存中編輯,編輯完成后,顯示在屏幕上。

        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 偶數行

編輯命令

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

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

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

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

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

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

          r /path/from/somefile:讀取指定文件的文本至模式空

            # sed -i.bak '/^U/r /etc/issue' f3

           //-i.bak表示把f3這個文件備份,然后在把/etc/issue這個文件讀入f3間中匹配到的行后

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

            # sed '/^UUID/p' /testdir/f3

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

   v        # sed '/^UUID/!d' /testdir/f3 == # sed -n '/UUID/p' /testdir/f3

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

          替換標記:

          g: 行內全局替換

          p: 顯示替換成功的行

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

             例子// sed ‘2p’ /etc/passwd

             sed –n ‘2p’ /etc/passwd

             sed –n ‘1,4p’ /etc/passwd

             sed –n ‘/root/p’ /etc/passwd

             sed –n ‘2,/root/p’ /etc/passwd 從2行開始

             sed -n ‘/^$/=’ file 顯示空行行號

             sed –n –e ‘/^$/p’ –e ‘/^$/=’ file

             sed ‘/root/a\superman’ /etc/passwd行后

             sed ‘/root/i\superman’ /etc/passwd 行前

             sed ‘/root/c\superman’ /etc/passwd 代替行


高級編輯命令

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

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

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

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

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

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

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

    d: 刪除模式空間中的行

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

         sed -n 'n;p' FILE

                    sed ‘/^$/d’ file

         sed ‘1,10d’ file

         nl /etc/passwd | sed ‘2,5d’

         nl /etc/passwd | sed ‘2a tea’

         sed 's/test/mytest/g' example

         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 '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

語法

   # sed [options] 'AddressCommand' file …

   "options:

         -n:不顯示模式空間中的行

         -i:直接修改源文件 

         -e SCRIPT -e SCRIPT:可以同時執行多個腳本

         -f /PATH/TO/SED_SCRIPT:

         # sed -f /path/to/sed_script

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

        

    "Address

         1、StartLine,EndLine

         比如1,100行

         $:最后一行

         2、/RegExp/

         /^root/

         3、/pattern1/,/pattern2/

         \\第一次被pattern1匹配到的行開始,至第一次被pattern2匹配到的行結束,這中間的所有行。

         4、LineNumber

         \\指定的行,精確某行。

         5、StartLine,+N

         \\從startLine開始,向后的N行;。

        

    "Command

         d:刪除符合條件的行

         # sed '1,2d' /etc/fstab

         p:顯示符合條件的行

         a \string:在指定的行后面追加新行,內容為string

         \\'\n':可以換行。

         i \string:在指定的行前面追加新行,內容為string

         r FILE:將指定范圍內的內容添加至符合條件的行處

         w FILE:將指定范圍內的內容另存至指定的文件中

         s/pattern/string/修飾符:查找并替換,默認至替換每行中第一次被模式匹配到的字符串

         加修飾符

         g:全局替換

         i:忽略字符大小寫

         s///:s@@@,s%%%,s###

         &:引用模式匹配整個串

         # sed 's#l..e#&r#g' sed.txt \\表示在匹配到的字符串中加入指定內容。

         # sed 's#\(l..e\)#\1r#g' sed.txt \\同上。

        

sed練習:

    1、刪除/etc/grub.conf文件中行首的空白符;

           # sed 's#^[[:space:]]##g' /etc/grub.conf

    2、刪除/etc/inittab文件中的空白行;

          # sed '/^$/d' /etc/inittab

    3、替換/etc/inittab文件中"id:3:initdefault:"一行中的數字為5;

         # sed 's@\(id:\)[0-9](\:initdefault:\)@\15@\2g' /etc/inittab

    4、刪除/etc/inittab文件中開頭的#號;

         # sed 's@^#@@g' /etc/inittab

    5、刪除某文件中開頭的#號及后面的空白字符,但要求#號后面必須有空白字符;

         # sed -r 's@^#[[:space:]]+@@g' /etc/inittab

    6、刪除某文件中以空白字符后面跟#類的行中的開頭的空白字符及#;

         # sed -r 's@^[[:space:]]+#@@g' /etc/inittab

    7、取一個文件路徑的目錄名稱

         # echo "/etc/rc.d" | sed -r  's@^(/.*/)[^/]+/?@\1@g'

    保留文件的基明

         # echo "/etc/rc.d" | sed -r 's@^/.*/([^/]+)/?@\1@g'


原創文章,作者:皺 多利亞,如若轉載,請注明出處:http://www.www58058.com/34290

(0)
皺 多利亞皺 多利亞
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • rpm包管理

    linux程序包管理 RPM ================================================================== #ldd 查看二進制程序調用的動態鏈接庫 #ldconfig  -p  顯示本機已緩存的所有可用庫文件     dll: Dynamic…

    Linux干貨 2016-08-18
  • vim文本編輯器簡單用法

    vim最基礎的用法

    2017-09-09
  • LAMP組合的編譯安裝(apache2.4+mariadb5.5+php5.6)

    安裝次序 httpd, MariaDB, php 安裝apache2.4 [root@root ~]# yum groupinstall "Development Tools" "Server Platform Develoment "&n…

    Linux干貨 2016-06-29
  • N22-第九周作業

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash # declare -i log_user declare -i notlog_user while read&n…

    Linux干貨 2016-10-24
  • 6個變態的C語言Hello World程序

    下面的六個程序片段主要完成這些事情: 輸出Hello, World 混亂C語言的源代碼 下面的所有程序都可以在GCC下編譯通過,只有最后一個需要動用C++的編譯器g++才能編程通過。 hello1.c  #define _________ }     #define ______…

    Linux干貨 2016-05-08
  • Sed簡介

    Sed簡介    一、簡介   sed全稱是:Stream EDitor。sed命令的功能同awk類似,差別在于,sed簡單,對列處理的功能要差一些,awk的功能復雜,對列處理的功能比較強大。  sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern s…

    Linux干貨 2015-05-11
欧美性久久久久