sed的詳細用法

sed(Stream EDitor)是一款流編輯器,用來對文本進行過濾與替換操作。其原理是:通過文件或管道讀取文件內容,但是sed默認并不直接修改源文件,而是一次僅讀取文件的一行至模式空間(pattern space)根據sed指令進行編輯并輸出結果后清除模式空間,即所有的操作都是在模式空間中進行的。

sed工作流程.png

語法格式

sed [option]... 'script' inputfile...

OPTIONS

-n,--quite,--silent:靜默輸出,即不輸出模式中的內容至輸出
-e script:使用多個腳本指令執行編輯
-f /PATH/TO/SCRIPT_FILE:從指定的文件中讀取編輯腳本
-r:支持在腳本中使用正則表達式
-i,--in-place:直接在文件原處執行編輯,即修改源文件

SCRIPT,地址+編輯指令

地址定界

(1) 不給地址:對全文進行處理;
(2) 單地址
    #:指定的行
    $:文件的最后一行
    /PATTERN/:被模式匹配到的每一行
(3) 地址范圍
    m,n:指定m行到n行
    #,+n:指定#行到#+n行
    /pat1/,/pat2/:匹配到的pat1到pat2之間的行
    #,/pat/:第#行到匹配到pat
(4) 步進:~
注意:如果//中正則表達式為空,則匹配最近一次正則表達式的匹配地址!

編輯命令

d:刪除
p:顯示模式空間的內容
a [\]text:在行后面追加內容,支持使用\n(換行符)實現多行追加
i [\]text:在行前面插入內容,支持使用\n(換行符)實現多行追加
c [\]text:替換行為單行或多行文本,支持使用\n(換行符)
w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定文件中
r /PATH/FROM/SOMEFILE:讀取指定文件的文本流至模式空間中匹配到的行的行后
=:為模式空間中的行打印行號
!:取反條件
s/pattern/replacement/flags:替換,支持使用其他分隔符,如:s@@@, s###
    替換標記(flags):
        #:替換行內匹配到的第#次的內容
        g:行內全局替換
        p:顯示替換成功的行
        w /PATH/TO/SOMEFILE:將替換后的結果保存至指定文件
    replacement:
        &:用pattern匹配到的內容進行替換
        \n:在pattern中使用\(\)指定時,匹配第n個子串

示例

1、刪除/boot/grub/grub.conf文件中所有以空白開頭的行行首的空白字符;

# sed 's/^[[:space:]]\+//' /boot/grub/grub.conf

2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符;

# sed 's/^#[[:space:]]\+//' /etc/fstab

3、echo一個絕對路徑給sed命令,取出其基名;進一步的,取出其目錄名;

# echo "/tmp/test/fstab" | sed 's/[^/]\+\/\?$//'

基于sed腳本文件進行文本處理

用法

sed -f SCRIPT_FILE FILE

SCRIPT_FILE

address{
command1
command2
...
}
命令使用花括號進行組合,使命令序列作用于同一個地址。另外,第一個命令可以和左花括號在同一行,但右花括號必須單獨處于一行。并且,命令后添加空格會產生錯誤。

sed的高級應用

除了存放當前輸入行緩沖區的模式空間,sed還有一個保持空間(hold space)的緩沖區。模式空間的內容可以復制到保持空間,保持空間的內容也可以復制到模式空間。

高級編輯命令

h:把模式空間中的內容覆蓋至保持空間
H:把模式空間中的內容追加至保持空間
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間取出數據追加至模式空間
x:把模式空間中的內容與保持空間中的內容進行互換
n:讀取匹配到的行的下一行至模式空間
N:追加匹配到的行的下一行至模式空間
d:刪除模式空間中的行
D:刪除多行模式空間中的所有行

常用高級命令

sed -n 'n;p' FILE:顯示偶數行
sed '1!G;h;$!d' FILE:逆向顯示文件內容
sed '$!N;$!D' FILE: 取出文件后兩行;
sed '$!d' FILE:取出文件最后一行;
sed 'G' FILE: 
sed '/^$/d;G' FILE: 
sed 'n;d' FILE: 顯示奇數行;
sed -n '1!G;h;$p' FILE: 逆向顯示文件中的每一行;

原創文章,作者:Jeason,如若轉載,請注明出處:http://www.www58058.com/58292

(0)
JeasonJeason
上一篇 2016-11-14 08:27
下一篇 2016-11-14 08:28

相關推薦

  • 文件的查找

    文件的查找 使用locate命令 默認從根開始搜索 非實時查找(數據庫查找) locate 文件名 查詢系統上預建的的文件索引數據庫    /var/lib/mlocate/mlocate.db 依賴于事先構建的索引 索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據庫(updatedb)。注意工作中不能輕易…

    Linux干貨 2016-08-18
  • yum命令用法及源碼的編譯

     一:yum 何為yum? yum是rpm的前端程序,可解決軟件包相關依賴性,可在多個庫之間定位軟件包,是up2date 的替代工具。 1.命令格式:     yum [options] [command] [package …] 2.yum客戶端配置文件: 公共配置文件:/etc/yum.conf   &…

    Linux干貨 2017-08-19
  • yum與rpm生產中最頻繁使用

    yum 命令 使用方法: yum [選項] [包名稱] 常用選項: install #安裝軟件,后面跟包名稱,例如:yum install wget 安裝wget軟件包list #列出所有軟件,一般和grep一起使用,例如:yum list | grep java ,查看所有java安裝包,一般情況下不使用search,grep可以更大范圍搜索包,例如只記得…

    Linux干貨 2017-04-18
  • LVM2:創建、使用、擴展、縮減、快照五步驟

    LVM2這是個關鍵的概念,還是從操作中比較容易理解 1、創建一個至少有兩個PV組成的大小為40G的名為testvg的VG;要求PE大小為16MB, 而后在卷組中創建大小為5G的邏輯卷testlv;掛載至/users目錄 注意點:在vmware中添加兩塊硬盤,但是并不能馬上可以查看,需要掃描一下磁盤,磁盤未/dev/sdc,/dev/sdd 然后創建LVM的基…

    Linux干貨 2016-09-05
  • 用戶組和權限管理相關作業

    1創建testuser uid 1234,主組:bin,輔助組:root,ftp,shell:/bin/csh home:/testdir/testuser     [root@ali ~]# useradd -u 1234 -g bin -G root,ftp -s /bin/csh -d /testdir/test…

    Linux干貨 2016-08-02
  • LAMP基于編譯安裝方式實現(httpd與php以fastcgi方式結合)3

    概述     在某些現有rpm包不能滿足需求的時候,可能需要編譯安裝LAMP環境,本篇就介紹下php與httpd結合方式為fastcgi方式結合時的編譯安裝,同時,由于httpd與php以module方式結合時,僅是編譯選項有所差別,故也會簡單說明下編譯選項的差異 環境     CentOS7系統,…

    Linux干貨 2016-10-17
欧美性久久久久