sed命令的基本使用方法

sed命令

stream editor,用程序的方式編輯文本。基本上是玩正則模式匹配。html

用s命令替換

$ sed "s/my/Hao Chen's/g" pets.txt正則表達式

  • 單引號去除全部字符的特殊意義,雙引號保留某些字符的特殊意義shell

  • 默認是將處理過的內容輸出,能夠加-i參數直接修改原文件
    $ sed -i "s/my/Hao Chen's/g" pets.txtspa

  • 在每行的最前面加東西
    $ sed 's/^/#/g' pets.txtcode

  • 在每行的最後面加東西
    $ sed 's/$/ --- /g' pets.txthtm

  • 正則表達式基本blog

    ^ 一行的開頭
    $ 同樣的結尾
    \< 詞首
    \> 詞尾
    . 任意單個字符
    * 某個字符出現0次或屢次
    [] 集合,[^]取反
  • 去除<>中的tags
    $ sed 's/<[^>]*>//g' html.txtthree

  • 只替換第3到6行
    $ sed "3,6s/my/your/g" pets.txt字符串

  • 只替換第一個
    $ sed 's/s/S/1' my.txtcmd

  • 只替換第3個之後的
    $ sed 's/s/S/3g' my.txt

  • &能夠做爲被匹配的變量
    $ sed 's/my/[&]/g' my.txt 給my加上[]

多個匹配

  • 分號分割
    sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt 前3行一個操做,後面一個操做
  • -e參數
    sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt

圓括號匹配

  • 圓括號內匹配的字符串能夠當變量使用\1,\2
    $ sed 's/This is my \([^,&]*\),.*is \(.*\)/\1:\2/g' my.txt

sed多行匹配

sed -e ":begin; /<<</,/>>>/ { />>>/! { $! { N; b begin }; }; s/<<<.*>>>/COMMENT/; };" test

:begin;標記開頭
/<<</,/>>>/ 表示後面的命令只處理<< <和> >>之間的部分,
後面的/>>>/! 表示若是當前行沒有匹配到結束標記/>>>/
$表明文本的最後一行,$!表示若是當前不是最後一行
N 將下一行內容追加到緩衝區,至關於"合併"成一行
b begin 表示跳回begin處從新開始執行命令
s/<<<.*>>>/COMMENT/; 終於匹配成功,將<< <到> >>之間的內容替換爲COMMENT

sed的命令

  • N命令:把偶數行的內容接到奇數行進行匹配,即兩兩合併,\n分隔
    $ sed 'N;s/\n/,/' pets.txt 鏈接兩行,用逗號分隔
  • a命令和i命令:插入和追加
# 第一行前插入一行    
$ sed "1 i This is my monkey, my monkey's name is wukong" my.txt
#最後一行後追加一行    
$ sed "$ a This is my monkey, my monkey's name is wukong" my.txt
#匹配到/fish/後追加一行
$ sed "/fish/a This is my monkey, my monkey's name is wukong" my.txt
  • c命令:替換匹配行
$ sed "2 c This is my monkey, my monkey's name is wukong" my.txt
$ sed "/fish/c This is my monkey, my monkey's name is wukong" my.txt
  • d命令:刪除匹配行
$ sed '/fish/d' my.txt
$ sed '2d' my.txt
$ sed '2,$d' my.txt
  • p命令:打印
# 默認會打印處理的信息
$ sed '/fish/p' my.txt
# -n參數只打印匹配的信息
$ sed -n '/fish/p' my.txt
# 打印從一個模式到另外一個模式的信息
$ sed -n '/dog/,/fish/p' my.txt
#從第一行打印到匹配fish成功的那一行
$ sed -n '1,/fish/p' my.txt

知識點

  • pattern space

    sed處理文本的僞代碼
    ​```
    對文件中每行數據
    {
        將一行數據放入pattern_space
        對每一個pattern space執行sed命令
        若是沒有指定-n則輸出處理後的pattern space
    }
    ​```
  • Address
    [address[,address]][!]{cmd}

address能夠是一個數字,也能夠是一個模式

# 可使用相對位置
$ sed '/dog/,+3s/^/# /g pets.txt'
  • 命令打包
    能夠用分號分隔,也能夠用大括號嵌套
# 第3到6行刪除This的行
$ sed '3,6 {/This/d}' pets.txt
# 第3到6行匹配了This,再匹配fish,則刪除
$ sed '3,6 {/This/{/fish/d}}' pets.txt
# 從第一行到最後一行,若是匹配到This,則刪除之;若是前面有空格,則去除空格
$ sed '1,${/This/d;s/^ *//g}' pets.txt
  • Hold Space不一樣行操做之間保持狀態

    g: hold space > pattern space中    
    G: hold space >> pattern space \n以後附加
    h: pattern space > hold space
    H: pattern space >> hold space \n以後附加
    x: 交換pattern space和hold space的內容

例若有以下文本

$ cat t.txt
one
two
three
$sed 'H;g' t.txt

one
 
one
two
 
one
two
three

分析

例子2(反序輸出)

$ sed '1!G;h;$!d' t.txt
three
two
one

命令能夠拆解爲3個

  • 1!G--只有第一行不執行G,將hold space附加到pattern space
  • h--每一行都執行h,將pattern space覆蓋hold space
  • $!d--最後一行不執行d,其他都清空pattern space

分析

相關文章
相關標籤/搜索