1. 程式人生 > >sed詳細用法及詳解

sed詳細用法及詳解

sed

#語法:
sed [options] ‘command‘ in_file[s]

options 部分:
-n 靜默輸出(不打印默認輸出)

-e 給予sed多個命令的時候需要-e選項
#sed -e ‘s/root/haha/g‘ -e ‘s/bash/wwwww/g‘ passwd > passwd.bak

如果不用-e選項也可以用分號“;”把多個命令隔開。
#sed ‘s/haha/ro/g ; s/wwwww/kkkk/g‘ passwd | less

-i -i後面沒有擴展名的話直接修改文件,如果有擴展名備份源文件,產生以擴展名結尾的新文件
#sed -iback1 -e ‘s/root/rottt/g‘ -e ‘s/bash/wwwww/g‘ passwd.back //選項-i後面沒有空格

[root@localhost 桌面]# ls
manifest.txt passwdback1

-f 當有多個要編輯的項目時,可以將編輯命令放進一個腳本裏,再使用sed搭配-f選項
[root@localhost 桌面]# cat s.sed
s/bin/a/g
s/ftp/b/g
s/mail/c/g
[root@localhost 桌面]# sed -f s.sed passwd | less

#command 部分:
‘[地址1,地址2] [函數] [參數(標記)]‘

定址: /[0-9]+/ 以它為 地址標準的才能執行後邊awk內容或sed內容
行地址對於任何命令都是可選的,它可以是一個模式,或者由斜杠、行號或行尋址符號括住的正則表達式, 大多數sed命令能接受由逗號分隔的兩個地址,有些命令只接受單個行地址

命令還可以用大括號進行分組,第一個命令可以和大括號放在同一行,但是右大括號必須自己一行

定址的方法 1.數字 2.正則
數字(行號):十進制數
1 單行
#sed -n ‘1p‘ passwd p是打印函數

    1,3 範圍 從第一行到第三行      
        #sed -n ‘1,3p‘ passwd

     2,+4   匹配行後若幹行         

     4,~3  從第四行到下一個3的倍數行

     1~3    第一行起每間隔三行的行

     $  尾行

     1! 除了第一行以外的行

正則:
   正則必須用//包裹起來
   擴展正則需要用 -r 參數或轉移

#範例:
#cat file.txt
.TS
Beijing,CN
.TE
Shanghai,CN
guangzhou,CN
shenyang,CN
#sed ‘/Beijing/s/CN/China/‘ file.txt

#刪除所有的行
#d
#只刪除第一行
#1d
#使用尋址符號$,刪除最後一行
#$d
#刪除空行,正則表達式必須封閉在斜杠//當中
#/^$/d
#刪除.TS 和.TE 標記的tbl 輸入
#/^.TS/,/^.TE/d
#刪除第五行到結尾所有的行
#5,$d
#混合使用行地址和模式地址
#sed ‘1,/^$/d‘ file.txt
#刪除除了那些行以外的行
#1,5!d

#分組命令
/^.TS/,/^.TE/{
s/CN/China/
s/Beijing/BJ/
}
sed ‘2,3s{/cn/china/;s/a/b/}‘ file.txt 同一範圍的兩個替換可以用大括號括起來一起,中間加分號

#函數:
增刪改:
a 後插
c 替換
i 前插

d刪除模式空間的所有內容,並接著讀入下一行到模式空間

#替換:[address ]s/pattern /replacement /flags
標誌flags是:
n 可以是1-512,表示第n次出現的情況進行替換
g 全局更改
p 打印模式空間的內容
w file 寫入到一個文件file中
i 忽略大小寫
[root@wing ~]# echo Aaaaba | sed -r ‘s/a./B/‘
AB
[root@wing ~]# echo Aaaaba | sed -r ‘s/a.
/B/i‘
B

  s 字符串替換 s/old/new/

#替換的時候可以把/換成其他的符號,比如=
#sed -n ‘s/root/ABCDEF/p‘ /etc/passwd
ABCDEF:x:0:0:root:/root:/bin/bash

replacement部分用下列字符會有特殊含義:

    & 用正則表達式匹配的內容進行替換
    \n 回調參數
    \(\)保存被匹配的字符以備反向引用\N時使用,最多9個標簽 標簽順序從左至右

    #cat test1
    first:second
    one:two
    #sed ‘s/\(.*\):\(.*\)/\2:\1/‘ test1
    second:first
    two:one

y 字符替換(變形) y是替換整個字符串 s也可以但是s是一個一個匹配的
r 從文件中讀入內容到指定行的後面
#sed‘2r b.txt’ a.txt 將b.txt文件內容讀入到文件a.txt的第2行後面

#工作模式:模式空間和保持空間介紹
模式空間:初始化為空,處理完一行後會自動輸出到屏幕並清除模式空間。
: 將符合內容進行更改 將更改的內容作為下一個的要更改的內容
: 將第一行處理完後 將處理過的內容 打印出來,將模式空間清楚 換第二行來處理
#置換:模式空間和保持空間(暫存空間)
h 把模式空間內容覆蓋到保持空間中
H 把模式空間內容追加到保持空間中
g 把保持空間內容覆蓋到模式空間中
G 把保持空間內容追加到模式空間中
x 交換模式空間與保持空間的內容
d刪除模式空間的所有內容,並接著讀入下一行到模式空間
顛倒輸出 直接用tac 就可以顛倒
$ sed ‘1!G;h;$!d‘ rev.txt
xyz
def
abc
$
詳解
1!G;h;$!d
文本
1
2
3
模式空間 保持空間
第一行 1 1 後邊將覆蓋
第二行 2 2 後邊將覆蓋
1 1
第三行 3 3
2 2
1 1

#cat passwd |tac
:wq
1
1
1
1
1
o
xiaomi:x:1000:1000:xiaomi:/home/xiaomi:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
emon:x:2:2:daemon:/sbin:/sbin/nologin

# cat test.sh 
1111111
2222222 
3333333
4444444
# sed  ‘{1h;2,3H;4G}‘  ./test.sh 
1111111
2222222
3333333
4444444
1111111
2222222
3333333
# sed  ‘{1h;2x;3g;$G}‘  ./test.sh 
1111111
1111111
2222222
4444444
2222222
保持空間:相當於粘貼板  裏邊內容不會主動被清空
保持空間:初始化為一個空行,也就是默認帶一個\n,處理完後不會自動清除。

#控制流
! 命令取反 例: 1!d 刪除第一行以外的行
{} 命令組合 命令用分號分隔 {1h;G} 可以理解為 -e 參數的另一種寫法
= 打印行號(輸入行的號碼,而非處理的次數行號) 例如: sed -n ‘2{=;p}‘ infile
n 讀入下一行到模式空間 例:‘4{n;d}‘ 刪除第5行
N 而是追加下一行到模式空間,再把當前行和下一行同時應用後面的命令
P 輸出多行模式空間的第一部分,直到第一個嵌入的換行符為止。在執行完腳本的最後一個命令之後,模式空間的內容自動輸出。
P命令經常出現在N命令之後和D命令之前。
D 刪除模式空間中直到第一個換行符的內容。它不會導致讀入新的輸入行,相反,它返回到腳本的頂端,將這些指令應用與模式空間剩余的內容。

  這三個命令能建立一個輸入、輸出循環,用來維護兩行模式空間,但是一次只輸出一行。
  這個循環的目的是只輸出模式空間的第一行,然後返回到腳本的頂端將所有的命令應用於模式空間的第二行。沒有這個循環,當執行腳本中的最後一個命令時,模式空間中的這兩行都將被輸出。
  # tac  將文本內容倒過來
  # cat a.txt |tac
   刪除文件倒數第二行
   #sed ‘N;$!P;D‘ a.txt
    N將下一行追加到模式空間中 現在模式空間中會有 第一行和第二行
    交給P來進行   P將 第一行輸出 出來 
    交給D來進行  D將 第一行刪除 然後重新執行子命令  然後在來一邊
    這樣循環如果只有N;P;D   內容將不會該變什麽 因為他可以循環到底
    在p前邊加$!  是為了取反 執行最後一行之外的行     N將最後一行和倒數第二行放裏邊了
    P執行時 不執行最後一行直接略過交給D執行  然後他把第一行刪除掉  內容中的第二行就被刪除了
    然後再循環一次   因為後邊沒有內容了 N不再執行 P將第一行輸出  粘貼板沒有內容了  D也不執行  

   刪除文件最後兩行
   sed ‘N;$!P;$!D;$d‘ a.txt

練習:
將第一行插入到每個偶數行的後面

$ sed  ‘1h;0~2G‘ a.txt
11111111
22222222
11111111
33333333
44444444
11111111
55555555
66666666
11111111

#腳本方法
-f 參數 引用腳本(腳本的末尾不能有空格制表符或其他文本)

cat sed.sh

2,4d
s/777/seker/
s/999/seker&seker/
# sed -f sed.sh test.txt 
1111111
5555555
6666666
seker7777
8888888
seker999seker9999

#在腳本中指明解釋器為sed

cat sed.sh

#!/bin/sed -f
2,4d
s/777/seker/
s/999/seker&seker/

sed詳細用法及詳解