今天遇到sed的相關用法,再次對sed的用法進行總結;
1. 替換命令
sed 's/{old_value/{new_value}/}'
實現使用new_value替換old_value的操作;例如
echo it is not your fault | sed 's/fault/problem/'
it is not your prolbem
多個修改替換,可以採用-e的方式,也可以使用;多次隔開。例如
第一種方式:echo it is not your fault | sed -e 's/your/my/' -e 's/fault/problem/'
第二種方式:echo it is not your fault | sed 's/your/my/ ; s/fault/problem/'
兩條語句的效果是一樣的,輸出都是:
it is not my problem
第三種方式:sed後加一個撇號,然後回車,可以採用多行輸入的方式.
全局修改
sed命令類似於替換命令,每次都處理每行中第一個出現的選定序列,要實現全局的修改,需要使用下面的格式
sed 's/{old_value}/{new_value}/g'
匹配替換
sed命令可以實現特定匹配字段的字符替換,例如
sed '/your/ s/fault/problem'將your後面的fault改成爲problem。
需要注意的一點:sed執行替換命令是每行單獨執行的,它處理過程以行爲單位,如果在某一行找到匹配內容,那麼將從改行的第一處進行替換修改,加入/g也是在改行的所有的位置進行修改。。如果在改行中沒有找到前面的匹配字段,則不進行修改。例如file
it is not your fault, but my fault
it is not my fault, but his fault
fault is not the reason
在上面的文檔中,如果採用 sed '/your/ s/fault/problem/' file 那麼只有在第一行找到相關的your匹配字段,那麼修改第一個fault爲problem,似乎執行正確。
但是,如果採用 sed '/my/fault/ s/fault/problem/' file 那麼在前兩行都可以匹配到my,那麼就會替換前兩行中第一次出現fault的地方爲problem,輸出爲:
it is not your problem, but my fault
it is not my problem, but his fault
fault is not the reason
同樣的,如果加/g,那麼也只是在當前行的所有值替換,因此需要謹慎使用。
還需要注意的就是,這裏只是改變了顯示,想要保存到指定文檔中,需要重定向。
源文件/腳本文件
sed -f script-file file
sed命令可以使用腳本文件,-f後面可以爲相應的腳本文件,值得注意的是,腳本文件中不使用撇號
限制行
編輯器默認查看輸入到流編輯器中的每一行,且默認在輸入到流編輯器中的每一行上進行編輯。這可以通過在發出命令之前指定約束條件來進行修改。例如
sed '3,4 s/fault/problem/' file 默認將第三行和第四行的fault值進行替換
禁止顯示
"-n" 覆蓋了所有的顯示,並且不顯示任何一行,而無論它們是否被編輯操作修改。
2.刪除行
sed '{what to find} d'
刪除相應的行,這裏由what to find限制到某一特定行
上三角號 (^) 表示一行的開始
美元符號 ($) 代表文件的結尾,或一行的結尾
sed '/fault/ d ' file
刪除file中包含fault的行
sed '/fault/ !d' file
刪除file中包含fault之外的所有行
sed '/^$/ d' {filename}
刪除文件中的所有空白行
sed ‘1,/^$/ d’ {filename}
刪除文件中第一行到第一個空行
3.插入/添加/寫到文件
sed '3i *****' 從第三行插入
sed '3a*****' 從第三行添加
sed ‘×××××× 1,3w new_file’ 重新將第一行到第三行寫到新文件中
4.修改
sed '/file/ c **************'
修改這裏是指,將匹配到的整行進行修改,將原來的整行修改爲新的內容,只要匹配,整行進行替換
$: 表示句尾. 如 abc$ 表示以 abc 結尾的句子.
\<: 表示詞首. 如 \<abc 表示以 abc 爲首的詞.
\>: 表示詞尾. 如 abc\> 表示以 abc 結尾的詞.
本文主要參考:
http://flierlh.iteye.com/blog/132809
http://fangfang0717.blog.51cto.com/236466/130525/