在 linux 系統中,有三個強大的文本分析處理工具:grep sed awk,其中:
grep 用於搜索文本內容 => linux grep 命令常見用法
sed 用於編輯文本內容 => linux sed 命令常見用法
awk 用於處理和生成報表 => linux awk 命令常見用法
這幾個命令用來對數據流進行處理的,其工作原理都是將文件內容逐行讀入,逐行處理。
sed 的全稱是 “stream editor” (數據流編輯器),從這個名字也可以看出,sed 是以數據流的方式對文本內容進行編輯的,而最常見的用法就是對文本中的特定字符串進行替換或者刪除,下面結合實例簡單介紹 sed 命令的常見用法:
假設文件 fin.txt 中的內容如下:
hello Jobs
hello Pony
hello Jack, hi Jack
1. 把每一行中的 Jack 替換成 Mark
sed 's/Jack/Mark/' fin.txt
>> hello Jobs hello Pony hello Mark, hi Jack
sed 命令一般是寫在單引號內,引號內開頭的 s 表示替換(substitute),
需要注意的是,在默認情況下,sed 只會替換每行中匹配到的第一個字符串,所以上面例子中最后一行的第二個 Jack 沒有被替換,如果希望替換每一行中所有匹配到的字符串,需加在命令末尾上選項 g,比如:
sed 's/Jack/Mark/g' fin.txt >> hello Jobs hello Pony hello Mark, hi Mark
注意這條命令並不會修改文件 fin.txt 的內容,只是將文件中的每一行讀入緩存,執行替換,然后輸出到屏幕,文件內容並沒有發生改變。
如果希望直接修改文件內容,可加上選項 “ -i ”
sed -i 's/Jack/Mark/g' fin.txt
2. 將 2~3 行中的 hello 替換成 hey
sed '2,3s/hello/hey/g' fin.txt >> hello Jobs hey Pony hey Jack, hi Jack
這條命令開頭的 2,3 表示僅在第 2 至第 3 行執行替換
3. 找出包含字符 Pony 的那些行,將這些行中的 hello 替換成 hey
sed '/Pony/s/hello/hey/g' fin.txt >> hello Jobs hey Pony hello Jack, hi Jack
這里的 Pony 是正則表達式,所以需要用 // 括起來
4. 刪除 2~3 行
sed '2,3d' fin.txt >> hello Jobs
命令中的 d 表示刪除(delete),執行之后第 2~3 行就被刪除了,僅剩下第一行
5. 刪除包含字符串 Pony 的行
sed '/Pony/d' fin.txt >> hello Jobs hello Jack, hi Jack
這里的 Pony 也是正則表達式,所以用 // 括起來了
6. 刪除空白行
sed '/^$/d' fin.txt
這里的 ^ 匹配一行的開頭, $ 匹配一行的結尾,所以 /^$/ 就表示一行的開頭和結尾之間沒有任何內容,也就是空白行;
注意有時候有些空白行是包含空格的,這種情況就需要寫成:
sed '/^\s*$/d' fin.txt
其中 \s 表示空格, 星號 * 表示前面的字符重復 0 次或多次,所以這種寫法可以匹配那些包含任意個空格的空白行
7. 刪除不包含字符 Pony 的行
sed '/Pony/\!d' fin.txt
這里的感嘆號 ! 表示反選,也就是選擇那些不符合正則表達式 /Pony/ 的行, 右斜杠表示轉義, 因為在有些系統下 ! 會被識別成其他的意思
8. 在指定某一行的前面或者后面添加一行
sed -i '1i\welcome' fin.txt >> welcome hello Jobs hello Pony hello Jack, hi Jack
這里的 1 表示第一行, i 表示在這一行前面添加一行,如果要在第一行后面添加一行,則用字母 a :
sed -i '1a\welcome' fin.txt
字母 a 是 append ,在后面添加一行
字母 i 是 insert, 在前面添加一行
9. 在匹配行的前面或者后面添加一行
sed -i '/Pony/a\welcome' fin.txt >> hello Jobs hello Pony welcome hello Jack, hi Jack
同樣,在后面添加一行用字母 a,在前面添加一行用字母 i
sed -i '/Pony/i\welcome' fin.txt
以上只是 sed 的常見用法,sed 的用法其實還有很多,
如果希望深入了解,建議參考相關書籍或者直接訪問 GNU sed 網站:
http://www.gnu.org/software/sed/manual/sed.html
|--------------------------------------|