Cody Blog

sed的s指令筆記

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 spaceHold space。sed執行是從input stream中,每次執行一行,流程大致如下:

  1. sed從input stream讀一行的內容
  2. 把換行符號(trailing newlines)移除
  3. 把它放到pattern sapce
  4. 執行指令(上面的例子就是s command把old取代成new)
  5. 把換行符號(trailing newlines)補回來
  6. sed 把結果印到 output steam
  7. 如果還有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/:'就顯得清楚多了。

Reference:

sed command

Related Posts

Comments