sed 命令多行到多行的定位方式


本文提要:

  • sed 命令定位方式的分類
  • 着重對 /pattern/,/pattern/ 的定位方式進行闡述

定位方式分類

總體上,只需要分為兩類,即:x 和 x,y 。如果在范圍后加 ! 則表示取補集,即指定范圍之外的所有行。

其中,x 和 y 均有兩種形式,即:數字和正則表達式,數字直接指定即可,正則表達式則用 /pattern/ 格式給出。舉兩個栗子:2,4 表示第 2 行到 第 4 行;/stdio.h/,5 簡單說可以闡述為匹配 stdio.h 的行到第 5 行的范圍,但是不准確,因為正則表達式匹配的行可能不止一行,更可能比后者行號大,這種情況下要分析其范圍,則需要按照一定的規則分析,請看下一節。

另外一些資料說 /pattern/pattern/ 表示查詢兩個表達式,筆者在自己的平台上測試了發現不行,不知是否打開方式不正確(GNU sed 4.4),但是其支持擴展正則表達式(-E 選項),所以可以用擴展正則實現。

定位方式分析

這里直接給出結論,然后再給出一個簡單的極端的栗子用以驗證。針對 x,y (x,y均可能是由 /pattern/ 匹配的多行)的匹配方式結論為:

首先假定一個控制輸出的開關,然后從首行依次匹配,到 x 集合中的行時,就打開輸出開關,允許輸出,到 y 集合中的行時,先輸出該行,然后關閉輸出開關,禁用輸出。

這樣所有輸出的行就是 x,y 的范圍,它可能是一個不連續集合。

下面給出一個栗子結束本文:

input.txt

grweag open
hgfds open
gfdsg
geahg close
feaws
grsa close
gfdsg
fdsa open
fdsa
gadfa close
fdsag close
fewag
gerwaef open
gewsa
gewag
gdfsa

執行

$ cat -n input.txt | sed -n '/open/,/close/p'
     1   grweag open
     2   hgfds open
     3   gfdsg
     4   geahg close
     8   fdsa open
     9   fdsa
    10  gadfa close
    13  gerwaef open
    14  gewsa
    15  gewag
    16  gdfsa

顯示的都是自 open 后 到 close 的行,close 后則不顯示,直到重新 open;open 后如果沒有 close 則其后所有行都在范圍內。如此我們可以推測如果 y 如果沒有匹配任何一行,則最終的范圍應該是 x 中最前面一行到文本的最后一行。


免責聲明!

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



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