s Command
s(substitue) 指令是 sed 中最常用的,可以把文件中的字串替換掉。基本的syntax s/RegEx/SubEx/
,例如 s/Old/New/
:
$ echo 'this is old' > input.txt
$ sed s/old/new/ input.txt
這個sed指令可以把文件中的old字串換成new
sed 執行流程
sed不像一般程式語言有 variable 的概念,但是sed有兩個特別的buffer(or workspace)可以讓sed執行較複雜的工作。這兩個buffer稱為Pattern space和Hold space。sed執行是從input stream中,每次執行一行,流程大致如下:
- sed從input stream讀一行的內容
- 把換行符號(trailing newlines)移除
- 把它放到pattern sapce
- 執行指令(上面的例子就是s command把old取代成new)
- 把換行符號(trailing newlines)補回來
- sed 把結果印到 output steam
- 如果還有input的話,就繼續執行step1,否則就結束
而pattern space在每一個迴圈都會清除,但是hold space則不會,可參考‘h’, ‘H’, ‘x’, ‘g’, ‘G’指令。
s 指令的其它選項
-e: sed script,可以連接多個 sed script,如果只有一個 sed script 則 -e 可以省略。例如:
$ echo 1234567890 | sed -e 's/1/x/' -e 's/5/x/'
另外也可以用;
來連結多個 sed script
$ echo 1234567890 | sed -e 's/1/x/;s/5/x/'
-f: 把結果輸出到另一個檔案
$ echo 's/1/x/\ns/5/x/' > /tmp/my.sed
$ echo 1234567890 | sed -f /tmp/my.sed
-i: in place 直接在該檔操作
$ sed -i s/Bad/Good/ input.txt
-n: 不要輸出結果到 output stream
flags for s command
s指令提供了一些flags可以讓執行可以有更多變化,常見的 flag有:
- i: ignore case
- g: global, 同一行中的所有match都替換
- n(數字): 只換第n個match
- p: print the result if match,常跟 -n(silent)一起用,只顯示有更動的內容
- w: write result to file if match,後面要指檔案名稱
- e(Execute PatSpace to PatSpace),m(Multi-Line mode matching)少用,略過。
範例
$ echo old old | sed s/old/new/g
同一行的全部配對都替換掉
$ echo old old | sed s/old/new/2
只替換第2個match,如果沒有加這個flag的話,預設就會是第一個match會被換掉
$ echo -e "12345\nabcde" | sed -n s/a/x/p
只output有更動行的內容
$ echo "this is bad" | sed 's/bad/good/w out.txt'
把結果輸出到 out.txt
有關 Delimiter
除了最常見的/
之外,也可以使用:
,|
,_
等分隔符。這在內文剛好出現分隔符的時侯,就可以派上用場。例如可以把$ echo /A/ | sed 's/\/A\//\/B\//'
改寫成 $ echo /A/ | sed 's:/A/:/B/:'
就顯得清楚多了。