本文提要:
- 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 中最前面一行到文本的最后一行。