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

相關推薦

  • glob及IO重定向

    globbing: 文件名通配     匹配模式:元字符           *:匹配任意長度的任意字符    pa* ,*pa* ,*pa,  *p*a*    pa, paa, passwd    ?:  …

    Linux干貨 2016-12-21
  • bash的工作特性之命令執行狀態返回值和命令行展開

    bash的工作特性之命令執行狀態返回值和命令行展開 bash的工作特性之命令執行狀態返回值和命令行展開 執行狀態返回值 命令行展開 執行狀態返回值     Linux下每一條命令或每一個進程執行完成會返回一個狀態碼. 0:成功執行 1-255:執行過程中出現異常或非正常退出 在Shell腳本中,最后…

    Linux干貨 2016-11-05
  • 20160803普通權限與特殊權限及umask

    權限     任何一個可執行程序文件能不能啟動為進程,取決發起者對程序文件是否擁有執行權限.即權限決定用戶對文件或者目錄的使用范圍.在Linux系統中,root的權限是最高的,可操作的權限最大,通常情況下root賬號只用于管理系統的重要信息,并不做日常維護工作,所以正確設定用戶的權限對系統的安全性尤為重要. 普通權限: 文件目錄只針對三類…

    Linux干貨 2016-08-04
  • Xen虛擬化平臺安裝及實時遷移

    前言 Xen是英國劍橋大學計算機實驗室開發的一個虛擬化開源項目,Xen可以在一套物理硬件上安全的執行多個虛擬機,它和操作平臺結合的極為密切,占用的資源極少。以高性能、占用資源少著稱,贏得了IBM、AMD、HP、Redhat和Novell等眾多世界級軟硬件廠商的高度認可和大力支持,已被國內外眾多企事業用戶用來搭建高性能的虛擬化平臺。 Xen虛擬化類型 Xen對…

    Linux干貨 2015-07-19
  • Linux發展與應用

                                                      &nbsp…

    2017-04-05
  • Linux程序包管理(一)RPM使用

    Linux程序包管理 在早期我們使用源代碼的方式安裝軟件時,都需要先把源程序代碼編譯成可執行的二進制應用程序,然后進行安裝。意味著每次安裝軟件都需要經過 預處理 –> 編譯 –> 匯編–> 鏈接, 這個復雜的過程。為簡化安裝步驟,程序提供商就在特定的系統上面編譯好相關程序的安裝文件并進行打包,提…

    Linux干貨 2016-06-01
欧美性久久久久