Linux學習----文本三劍客——sed(馬哥教育原創)

來源:馬哥教育正則表達式

我之前的文章介紹過grep了,今天我就來講一下第二個sed,它是stream editor的縮寫。在Linux的文本文件中文本存儲都是一行,顯示時表現的多行其實都是由於有換行符的存在,例如:文本是:abc$def$ghi 顯示出來就是三行了。Sed就是一個行編輯器,它一次讀一行文本進行操做,而後根據咱們的選擇看是否同步到文本之中。還有一個叫awk的,在Linux上叫作gawk(gnu awk),它是一個文本格式化工具,咱們下一篇文章再說。編輯器

         工做機制:每次讀取一行文本至「模式空間(pattern space)」中,在模式空間中完成處理;將處理結果輸出至標準輸出設備;工具

         語法:sed [OPTION]... {script} [input-file]...

                  -r: 支持擴展正則表達式;spa

                  -n: 靜默模式;regexp

                  -e script1 -e script2 -e script3:指定多腳本運行;ip

                  -f /path/to/script_file:從指定的文件中讀取腳本並運行;input

                  -i: 直接修改源文件;同步

      地址定界:

                  #: 指定行;it

                  $: 最後一行;test

                  /regexp/:任何可以被regexp所匹配到的行;sed ‘/^#/d’ /etc/fstab #刪除以井號開頭的行

                  \%regexp%:同上,只不過換做%爲regexp邊界符;

                  /regexp/| :匹配時忽略字符大小寫;

                  \%regexp%| :匹配時忽略字符大小寫;

                  startline,endline:

                           #,/regexp/:從#行開始,到第一次被/regexp/所匹配到的行結束,中間的全部行;

                          #,#

                           /regexp1/,/regexp2/:從第一次被/regexp1/匹配到的行開始,到第一次被/regexp2/匹配到的行結束,中間的全部行;

                          #,+|-n:從#行開始,一直到向下的n行;

                           first~step:指定起始行,以及步長;

      sed的編輯命令

                          d: 刪除模式空間中的行;sed ‘1,2d’ /etc/fstab

                          =:顯示行號;sed ‘/^#/=’ /etc/fstab #顯示以#號開頭的行的行號

                          a \text:附加text;sed ‘/^#/a \new line’ /etc/fstab        #在以井號開頭行的後面添加new line字樣

                                   sed ‘1a \new line\nsecond line\ntherid line’     #\n表示換行符

                          i \text:插入text,支持\n實現多行插入;

                          c \text:用text替換匹配到的行;sed ‘/5,7/c \new txt’                 #五到七行都替換成一個new txt

                                   sed ‘/^#/c \new txt’ /etc/fstab     #只有井號開頭的行都替換成new txt,不僅一個

                          p: 打印模式空間中的行;sed ‘5,7p’ /etc/fstab       #5-7行的內容顯示兩遍,使用-n才符合咱們的指望

                          s/regexp/replacement/:替換由regexp所匹配到的內容爲replacement;

                                   g: 全局替換;

                                   i: 不區分大小寫    #sed ‘s/^#//g’ /etc/fstab

                          w /path/to/somefile:把指定的內容另存至/path/to/somefile路徑所指定的文件中;

                                   # sed ‘5,9w /tmp/test1.txt’ /etc/fstab #將fstab中的5-9行寫到test1.txt中

                          r /path/from/somefile:在文件的指定位置插入另外一個文件的全部內容,完成文件合併;

                                   #sed ‘8r /etc/issue’ /etc/fstab      #將issue的第8行以後的內容讀進來放到fstab以前

            練習:

                                   (1) 刪除/boot/grub/grub.conf文件中全部行的行首的空白字符;

                                            sed 's/^[[:space:]]\+//' /boot/grub/grub.conf

                                   (2) 刪除/etc/fstab文件中全部以#開頭,後跟至少一個空白字符的行的行首的#和空白字符;

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

                                   (3) 把/etc/fstab文件的奇數行另存爲/tmp/fstab.3;

                                            sed '1~2w /tmp/fstab.3' /etc/fstab

                                   (4) echo一個文件路徑給sed命令,取出其基名;進一步地,取出其路徑名;

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

                                            取路徑名:echo "/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@'

Sed不只有一個模式空間,還有一個保持空間,它能夠幫助sed暫時存儲一些東西以便後續的使用。

            高級命令:

                                   h:用模式空間中的內容覆蓋保持空間的內容;

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

                                   g:從保持空間中取到其內容,並將其覆蓋模式空間中的內容;

                                   G:從保持空間中取到其內容,並將其追加在模式空間中的內容的後面;

                                   x:把保持空間和模式空間中的進行交換;

                                   n:讀取匹配到的行的下一行至模式空間;(會覆蓋模式空間中的原有內容);

                                   N:讀取匹配到的行的下一行至模式空間,追加在模式空間中原有內容的後面;

                                   d:刪除模式空間中的內容;

                                   D:刪除多行模式空間中的首行;

                                   注意:命令功能可以使用!取反;分號可用於分隔腳本;

                  示例:

                                   sed 'G' /etc/issue: 在文件中的每行後方添加空白行;

                                   sed '$!d' /etc/fstab:保留最後一行;

                                   sed '/^$/d;G' /etc/issue: 保證指定的文件每一行後方有且只有一個空白行;

                                   sed 'n;d' /etc/issue:保留奇數行;

                                   sed -n '1!G;h;$p' /etc/issue :全文倒敘顯示

                                   sed '$!N;$!D' /etc/issue:顯示最後兩行

                  sed命令:

                          -e 'script' -e 'script'

                          'script;script;script' 與上一行模式相同

                          script

                          script

                          script

                          -f /path/from/script 都是第一行的做用

相關文章
相關標籤/搜索