sed處理時,有2個緩沖區:【pattern space】和【hold space】
sed執行程序:
先讀入一行,去掉尾部換行符,存入【pattern space】,執行編輯命令, 處理完畢,除非加了-n引數,把現在的【pattern space】列印出來,在后邊列印曾去掉的換行符, 把【pattern space】置空, 接著讀下一行,處理下一行,
sed的默認輸出:【pattern space】里的內容輸出到標準輸出,
常用選項:
-
【pattern space】里的內容不輸出到標準輸出:-n
-
默認只能執行一個腳本,執行多個腳本:-e script, --expression=script
可以有多個-e script
-
如果要執行的腳本特別多,可以指定一個腳本檔案:-f /path/to/sed_scirpt
腳本檔案里,每行一個編輯命令,
-
支持使用擴展的正則運算式,默認是基本正則運算式:-r
-
直接編輯原檔案:-i
地址定界:
1,不給地址:對全文進行處理
2,單地址
- #:指定行
- /pattern/:被此模式所匹配到的每一行
3,地址范圍
-
$:最后一行
-
#,#:起始和結束
-
#,+#:起始,和從起始加多少行
-
#,/pat1/:起始到,pat1匹配到的行
-
/pat1/,/pat2/:pat1匹配到的行,到pat2匹配到的行
4,步進:~
- 1~2:1,3,5,7,9.,,行(所有奇數行)
- 2~2:2,4,6,8,10.,,行(所有偶數行)
編輯命令:
如果有多個命令,則用分號分隔,
-
刪掉【pattern space】里的內容:d
洗掉/etc/fstab的第一行到第五行,
# sed '1,5d' /etc/fstab -
列印【pattern space】里的內容:p
乍一看是列印奇數行,但實際是把偶數行列印了出來,而且奇數行列印了2遍, # sed '1~2p' /etc/fstab 使用-n禁止sed的默認行為后,就是列印奇數行了 # sed -n '1~2p' /etc/fstab -
在行前插入:-i \text 支持使用\n實作多行插入
# sed '3a \new line\nother line' /etc/fstab # # /etc/fstab new line other line 在UUID行前加一段注釋: # sed '/^UUID/i \#this is base for UUID' /etc/fstab #this is base for UUID UUID=3d3b316a-529e-484a-9895-e785fdde5365 /boot xfs defaults 0 0 -
在行后插入:-a \text 支持使用\n實作多行插入
# sed '3i \new line\nother line' /etc/fstab # new line other line # /etc/fstab -
替換行:-c \text 把匹配到的行,替換成text
把以UUID開頭的行,整行替換成text,
# sed '/^UUID/c \#this is base for UUID' /etc/fstab -
保存匹配到的行,到指定檔案中:-w /path/to/save
把不以#號開頭的行,保持到/tmp/fsnew
# sed -n '/^[^#]/w /tmp/fsnew' /etc/fstab -
把指定檔案中的內容插入到匹配行的后面:-r /path/to/insert
在/etc/fstab的第三行的后面,插入/tmp/tst的內容,
# cat /tmp/tst aaa bbb [root@localhost ~]# sed '3r /tmp/tst' /etc/fstab # # /etc/fstab aaa bbb -
在匹配到的行的上一行,加上行號:=
在以UUID開頭的行的上一行加上行號
# sed '/^UUID/=' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Nov 29 16:44:28 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 10 UUID=3d3b316a-529e-484a-9895-e785fdde5365 /boot xfs defaults 0 0 -
匹配到的行不執行后面的命令;沒匹配到的行執行后面的命令:!,注意:!處理命令之前,
洗掉不以#開頭的行:
# sed '/^#/!d' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Nov 29 16:44:28 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # -
查找替換:s/要替換的/替換成的/替換標記,它的分隔符/可以自己指定,常用的有s@@@,s###
替換標記:
- 全域替換:g
- 將替換成功的結果保存到檔案:w /path/to/save
- 顯示替換成功的行:p
練習
1,洗掉test檔案中所有以空白字符開頭的行的行首的所有空白字符
# cat test
11
222
333
\+:匹配前面的次數為大于等于1
# sed 's@^[[:space:]]\+@@' test
11
222
333
# sed -n 's@^[[:space:]]\+@@p' test
11
333
2,洗掉/etc/fstab檔案中所有以#開頭的行的行首的#號及#后面所有空白字符
# sed 's@^#[[:space:]]*@@' /etc/fstab
3,洗掉/etc/fstab檔案中所有以#開頭的行的行首的#號及#后面所有空白字符,和洗掉所有以UUID開頭的行
# sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab
4,輸出一個絕對路徑給sed命令,取出其目錄部分,其行為類似dirname
message后面如果有/就匹配不成功了,
# echo "/var/log/messages" | sed 's@[^/]\+$@@'
/var/log/
message后面即使有/也能匹配:非/
[^/]:非/
\+:至少一個
/\?:/有0個或者1個
# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
/var/log/
message后面即使有/也能匹配
由于使用了-r(擴展正則運算式),+和?前面的\可以省略了,
# echo "/var/log/messages/" | sed -r 's@[^/]+/?$@@'
/var/log/
[root@localhost ~]#
高級編輯命令
- 把【pattern space】空間中的內容覆寫到【hold space】空間:h
- 把【pattern space】空間中的內容追加到【hold space】空間,然后洗掉【pattern space】空間中的內容:H
- 把【hold space】空間中的內容覆寫到【pattern space】空間:g
- 把【hold space】空間中的內容追加到【pattern space】空間,然后洗掉【hold space】空間中的內容:G
- 互換【hold space】【pattern space】里的內容:x
- 把匹配到的行的下一行放入【pattern space】,并把匹配到的行洗掉掉:n
- 把匹配到的行的下一行放入【pattern space】,不洗掉匹配到的行:N
- 洗掉【pattern space】空間中的行:d
- 洗掉多行模式下【pattern space】里的所有行,(比如用N了,【pattern space】里就有多行):D
1,顯示偶數行:
執行程序:先把第一行讀入到了【pattern space】,后面的命令的n,n的意思是讀下一行,并洗掉當前【pattern space】里的內容后,再把下一行的內容放入【pattern space】;接下來的命令是p,p就是把當前【pattern space】里的內容輸出到標準輸出,所有第二行就列印到了標準輸出了,然后讀第3行,后面的命令是n,就再讀一行,以此類推,
# sed -n 'n;p' /etc/fstab
2,倒置文本:
參看:https://blog.csdn.net/itsenlin/article/details/21129405
執行程序:先把第一行讀入到了【pattern space】,發現第一行的命令是1!G,所以不做處理;接著是h,則把【pattern space】的內容,覆寫到【hold space】;接著是命令$!d,因為不是最后一行,所以執行d命令,洗掉【pattern space】里的內容,
讀第二行到【pattern space】,發現命令是1!G,由于不是第1行了,所以執行G命令,把hold space】的內容追加到了【pattern space】,這時【pattern space】里放的是第二行和第一行的內容,而且第二行在第一行的前面,接著是$!d,由于不是最后一行,所以執行d命令,洗掉【pattern space】里的內容,
# cat test
11
222
333
最后一行,沒有執行d,而且【pattern space】里的內容,而且沒有使用-n,所以就把倒敘列印到標準輸出了,
# sed '1!G;h;$!d' ./test
333
222
11
也可以用下面的命令,實作倒置,
由于沒有使用d命令,所以【pattern space】里一直有內容,所以就必須用-n,最后一次用p命令把【pattern space】里的內容輸出到標準輸出,
# sed -n '1!G;h;$p' test
3,取出最后一行:
# sed '$!d' /etc/fstab
4,取出最后二行:
# sed '$!N;$!D' test
5,洗掉原有的所有空白行,而后為所有的非空白行添加一個空白行
# cat test
11
空行
空行
222
空行
空行
333
444
555
666
# sed '/^$/d;G' test
11
空行
222
空行
333
空行
444
空行
555
空行
666
空行
6,顯示奇數行
# sed 'n;d' /etc/fstab
7,在每一行后面添加一個空白行
# sed 'G' /etc/fstab
8,練習H和g的用法:
# cat t2
one
two
three
# sed 'H;g' t2
一個空行
one
一個空行
one
two
一個空行
one
two
three
圖解:H是往hold space里追加,hold space里,其實是有一個換行的,所以第一次把one加到hold space后,one的前一行就是空行,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/139886.html
標籤:Linux
上一篇:nginx安裝手冊
