sed(流編輯器)入門
sed 是 stream editor(流編輯器)的縮寫。它能夠完美配合正則表達式使用。sed命令眾所周知的一個功能是文本的替換。
1、sed可以替換給定文本中的字符串。它可以配合正則表達式來進行匹配:
$ sed ' s/pattern/replace_string/ ' file
或者
$ cat file | sed sed ' s/pattern/replace_string/ ' //這個命令從stdin中讀取輸入
使用 -i 選項可以將替換結果應用於源文件。一般在進行替換後利用重定向來保存文件。
$ sed ' s/pattern/replace_string/ ' file > newfile
用新文件來替換源文件:$ mv newfile file
也可以用一行命令來完成:
$ sed -i ' s/pattern/replace_string/ ' file
sed ' s/pattern/replace_string/ ' file 可以將每行中第一處匹配樣式的內容替換掉,要想把所有符合的字符都替換掉,需要在命令尾部加上參數 g,如下
sed ' s/pattern/replace_string/g ' file
後綴/g表示sed會替換每一處匹配。
當不需要每處替換時,可以選用/Ng來選擇從第N處開始替換,如下:
sed ' s/pattern/replace_string/Ng' file
$ echo hello hello hellohello | sed 's/hello/HELLO/2g'
$ hello HELLO HELLOHELLO // 輸出結果
字符/ 在sed中起到定界符作用,我們也可選用任意定界符
sed ' s:pattern:replace_string:g '
sed ' s|pattern|replace_string|g'
當定界符出現在要匹配的樣式中時則需要用前綴 \ 來對其轉義:
sed ' s;he\;llo;replace_string; '
2、sed 命令包含多個可用於對文本處理的選項。將這些選項已合理的順序組合,可以在一行命令中解決很多復雜的問題。如下:
a、移除空白行:
空白行可用'^$'進行匹配
$ sed '/^$/d' file
b、已匹配字符串標記(&)
在sed中,用&標記匹配樣式的字符串,就能夠在替換字符串時使用已匹配的內容。
$ echo this is an example | sed 's/\w\=/[&]/g'
$ [this] [is] [an] [example]
ps: \w為 正則表達式匹配字符(Perl風格的正則表達式),但是下表中的字符並不是所有的工具都支持
利用正則表達式\w\+匹配一個單詞,然後用 [ & ] 替換它。&對應於之前所匹配到的單詞。
c、子串匹配標記 \1
&代表匹配給定樣式的字符串。我們也可以匹配給定樣式中的其中一部分。
$ echo this is digit 7 in a number | sed ' s/digit \([0-9]\)/\1/'
$ this is 7 in a number
上述命令將digit 7 替換為7。樣式中匹配到的子串是7.
$ echo seven EIGHT | sed 's/\([a-z]\+\) \([a-z]\+\)/\2 \1/'
$ EIGHT seven
([a-z]\+) 匹配第一個單詞,([a-z]\+) 匹配第二個單詞。 \1和 \2用來引用它們。這種引用被稱為後向引用。 在替換部分,它們的次序被更改為\2 \1,因此結果就呈現出逆序的形式。
d、組合多個表達式
利用管道組合多個sed命令。
$ sed 'expression' | sed 'expression1'
等價於:
$ sed 'expression; expression1'
e、引用
sed表達式通常用單引號來引用。不過也可以使用雙引號。雙引號會通過對表達式求值來對其進行擴展。
如:
$ text=hello
$ echo hello world | sed "s/$text/HELLO/"
$ HELLO world
$text 求值的結果是hello