自學Linux Shell18.2-sed編輯器高級特性

點擊返回 自學Linux命令行與Shell腳本之路html

18.2-sed編輯器高級特性

linux世界中最普遍使用的兩個命令行編輯器:linux

  • sed
  • gawk

1. sed小結

命令格式:正則表達式

1 sed [options] 'command' file(s)
2 sed [options] -f scriptfile file(s)

選項:shell

  • -e<script>或--expression=<script>:以選項中的指定的script來處理輸入的文本文件;
  • -f<script文件>或--file=<script文件>:以選項中指定的script文件來處理輸入的文本文件;
  • -h或--help:顯示幫助;
  • -n或--quiet或——silent:僅顯示script處理後的結果;
  • -V或--version:顯示版本信息。

參數:express

文件:指定待處理的文本文件列表。app

sed命令:編輯器

  • a\      在當前行下面插入文本。
  • i\      在當前行上面插入文本。
  • c\      把選定的行改成新的文本。
  • d      刪除,刪除選擇的行。
  • D      刪除模板塊的第一行。
  • s      替換指定字符
  • h      拷貝模板塊的內容到內存中的緩衝區。
  • H      追加模板塊的內容到內存中的緩衝區。
  • g      得到內存緩衝區的內容,並替代當前模板塊中的文本。
  • G      得到內存緩衝區的內容,並追加到當前模板塊文本的後面。
  • l      列表不能打印字符的清單。
  • n      讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
  • N      追加下一個輸入行到模板塊後面並在兩者間嵌入一個新行,改變當前行號碼。
  • p      打印模板塊的行。
  • P(大寫)      打印模板塊的第一行。
  • q      退出Sed。
  • b lable      分支到腳本中帶有標記的地方,若是分支不存在則分支到腳本的末尾。
  • r file      從file中讀行。
  • t label      if分支,從最後一行開始,條件一旦知足或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。
  • T label      錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。
  • w file      寫並追加模板塊到file末尾。
  • W file      寫並追加模板塊的第一行到file末尾。
  • !      表示後面的命令對全部沒有被選定的行發生做用。
  • =      打印當前行號碼。
  • #      把註釋擴展到下一個換行符之前。

sed替換標記:測試

  • g      表示行內全面替換。
  • p      表示打印行。
  • w      表示把行寫入一個文件。
  • x      表示互換模板塊中的文本和緩衝區中的文本。
  • y      表示把一個字符翻譯爲另外的字符(可是不用於正則表達式)
  • \1      子串匹配標記
  • &      已匹配字符串標記

sed元字符集:ui

  • ^      匹配行開始,如:/^sed/匹配全部以sed開頭的行。
  • $      匹配行結束,如:/sed$/匹配全部以sed結尾的行。
  • .      匹配一個非換行符的任意字符,如:/s.d/匹配s後接一個任意字符,最後是d。
  • *      匹配0個或多個字符,如:/*sed/匹配全部模板是一個或多個空格後緊跟sed的行。
  • []      匹配一個指定範圍內的字符,如/[ss]ed/匹配sed和Sed。
  • [^]      匹配一個不在指定範圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。
  • \(..\)      匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。
  • &      保存搜索字符用來替換其餘字符,如s/love/**&**/,love這成**love**。
  • \<      匹配單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。
  • \>      匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。
  • x\{m\}      重複字符x,m次,如:/0\{5\}/匹配包含5個0的行。
  • x\{m,\}      重複字符x,至少m次,如:/0\{5,\}/匹配至少有5個0的行。
  • x\{m,n\}      重複字符x,至少m次,很少於n次,如:/0\{5,10\}/匹配5~10個0的行。

2. sed高級特性--多行命令

全部的sed編輯器命令都是針對單行數據執行操做的,那若是處理多行名利怎麼處理,sed編輯器包含了3個特殊的命令:spa

  • N 將數據流中的下一行加進來建立一個多行組來處理
  • D 刪除多行組中的一行
  • P 打印多行組中的一行

2.1 next 命令

2.1.1 單行next命令(小寫的n)

         n:讀入下一行到模式空間,例:’4{n;d}’ 刪除第5行。

2.1.2 多行next命令(大寫的N)

  •  單行next命令n 會將數據流中的下一個文本行移動到sed編輯器的工做空間(模式空間)
  •  多行next命令N 會將數據流中的下一個文本行添加到模式空間中已有的文本後,也就是講數據流中的兩個文本合併後到同一個模式空間

①若是短語在同一行的話,N命令將下一行合併同一行,相對比較簡單。

②若是短語不在同一行的話,替換命令就沒法識別了,此時每每使用通配符.來匹配空格和換行符這兩種狀況。

問題1:匹配了換行符時,就從字符串刪掉了換行符,致使兩行合併成一行。

解決辦法:使用兩個替換命令

  • 一個用來匹配短語出如今多行的狀況
  • 一個用來匹配短語出如今單行的狀況

問題2:若是匹配的文本正好在數據流的最後一行,命令就不會發現匹配的數據。

解決辦法:

  •     將單行命令放到N命令前面
  •     將多行命令放到N命令後面

2.2 delete 命令

2.2.1 單行delete命令(小寫的d)    (上章已經介紹過了)

         d:刪除模式空間中的當前行

 可是d 與N 一同使用的時候要注意,刪除命令會在不一樣行查找匹配文本,而後在模式空間將所匹配的行所有刪掉。

 

2.2.2 多行delete命令(大寫的D)   

         D:只刪除模式空間中的第一行,會刪除到換行符位置的全部字符。

 

2.3 print命令

  • p  (小寫)  打印模式空間的當前行
  • P (大寫)  打印多行模式空間的第一部分,直到第一個嵌入的換行符位置。在執行完腳本的最後一個命令以後,模式空間的內容自動輸出。P命令常常出如今N命令以後和D命令以前。

3. sed高級特性--模式空間、保持空間

  •  模式空間(pattern space)是一塊活躍的緩衝區,在執行命令時它會保存待檢查的文本
  •  保持空間(hold space)在處理模式空間中的某些行時,能夠保持空間來臨時保存一些行

有5條命令用來操做保持空間: 

  • h 將模式空間複製到保持空間;
  • H 將模式空間附加到保持空間;
  • g 將保持空間複製到模式空間;
  • G 將模式空間附加到保持空間;
  • x 交換模式空間和保持空間的內容

 

4. sed高級特性--排除命令!

 感嘆號  ! 命令用來排除命令,就是讓本來會起做用的命令不起做用。

 

 

 

5. sed高級特性--改變流

 sed編輯器會從腳本的頂部開始,一直執行到腳本的結尾。sed編輯器提供了一個方法改變命令腳本的執行流程。

  • 分支b命令用於無條件轉移
  • 測試t命令用於有條件轉移。

 5.1 分支b命令

1 [address]b [lable]
  • 跳轉的位置與標籤相關聯:address決定了哪些行的數據會觸發分支命令,lable參數決定了跳轉到的位置。 
  • 若是有label參數則跳轉到標籤所在的後面行繼續執行。
  • 若是沒有label參數,跳轉命令會跳轉到腳本的結尾。
  • 標籤:以冒號開始後接標籤名,不要在標籤名先後使用空格。
  • 能夠爲分支命令指定一個模式來查找,若是沒有模式,跳轉就應該結束。(防止一些無窮循環)

 

 5.2 測試t命令

1 [address]t [lable]
  • 測試命令t會根據替換命令結果跳轉到某個標籤,而不是根據地址進行跳轉。
  • 若是替換命令成功匹配並替換了一個模式,測試命令就會跳轉指定的標籤;若是替換命令沒有匹配指定的模式,測試命令就不會跳轉。
  • 有指定標籤的話,若是測試成功,跳轉命令會跳轉到腳本的結尾。

6. sed高級特性--模式替換

6.1 &符號用來表明替換命令中的匹配的模式

.at 當模式匹配了單詞cat,「cat」就會出如今替換後的單詞裏。模式匹配了單詞hat,「hat」就會出如今替換後的單詞裏。

6.2 替代單獨的單詞, 使用替代字符:反斜線+數字 

替代字符由反斜線+數字組成,數字代表子模式的位置。sed編輯器會給第一個模式分配字符\1  第二個模式分配字符\2  以此類推。

7. sed高級特性--在腳本中使用sed

7.1 使用包裝腳本wrapper

能夠將sed命令放到shell包裝腳本中,不用每次使用時都從新鍵入整個腳本。

7.2 重定向sed的輸出

在腳本中使用$()將sed編輯器命令的輸出重定向到一個變量中。

相關文章
相關標籤/搜索