性夜影院午夜看片,无码精品久久一区二区三区,婷婷成人丁香五月综合激情,校园春色 qvod,性调教室高h学校

sed的基本用法詳解

在Linux的世界中,有著一個文本三劍客的稱呼,它們分別代表grep(文本過濾),sed(流編輯器),awk(gawk)(報告生成器)。

它們是強大的文本處理工具,了解并掌握它們,可以讓你對文本的處理更加從容和輕松。

今天我們主要是圍繞sed來進(jìn)行分析。

一、初識sed

sed:Stream Editor

從名字上也可以直觀的了解到它是一個流編輯工具。何為流編輯器?就是把文本中的文字按照特定的分隔方式,進(jìn)行數(shù)據(jù)流處理。sed就是基于這種方式,它是以換行符以分隔單位,對文本進(jìn)行逐行的處理。


二、初識sed的工作原理

blob.png

前提:首先對于一個文本文件來說,它是由至上而下的一行或N行組成。

1、當(dāng)用sed命令對文本進(jìn)行處理的時候,sed先讀取對象的文本文件的第一行到模式空間中。

2、當(dāng)有內(nèi)容進(jìn)入“模式空間”時,sed的編輯命令對模式空間中的內(nèi)容進(jìn)行編輯操作(修改,替換,刪除,追加,顯示等等)

3、模式空間中的內(nèi)容編輯處理完成之后,sed把此內(nèi)容通過標(biāo)準(zhǔn)輸出(默認(rèn)為顯示器)打印出來,并刪除模式空間中的內(nèi)容。

4、第一行處理結(jié)束。從新讀取第二行的內(nèi)容進(jìn)行處理,直到最后一行。


三、sed命令的基本語法

   sed OPTIONS... [SCRIPT] [INPUTFILE...]

   常用的選項:

       -n,--quiet: 不輸出模式空間中的內(nèi)容

       -i: 直接編輯原文件,默認(rèn)不對原文件進(jìn)行操作

       -e: 可以使用多個命令(腳本)進(jìn)行操作

       -f /path/from/sed_script: 從指定的文本中讀取處理腳本

       -r: 使用擴展正則表達(dá)式


四、模式空間中的編輯操作

1、地址定界:

    1)#:#為數(shù)字,指定要進(jìn)行處理操作的行

    2)$:表示最后一行,多個文件進(jìn)行操作的時候,為最后一個文件的最后一行

    3)/regexp/:表示能夠被regexp匹配到的行

       regexp及基于正則表達(dá)式的匹配:關(guān)于正則表達(dá)式的請參考grep的基本用法詳解中的【三、了解正則表達(dá)式】

    4)/regexp/I:匹配是忽略大小寫

    5)\%regexp%: 任何能夠被regexp匹配到的行,換用%(用其他字符也可以,如:#)為邊界符號

    6)addr1,addr2:指定范圍內(nèi)的所有的行(范圍選定)

       常用的以下幾種表示方法:

        a)0,/regexp/:從起始行開始到第一次能夠被regexp匹配到的行

        b)/regexp/,/regexp/:被模式匹配到的行內(nèi)的所有的行

        c)#,#:#為數(shù)字,給定具體的行范圍

        d)#,+N:#為數(shù)字,從#開始的行開始,向下N行的所有的行

    7)first~step:指定起始的位置及步長,例如:1~2表示1,3,5...

2、常用的編輯命令:

    1)d:刪除匹配到的行

    2)p:打印模式空間中的內(nèi)容

       注意:sed默認(rèn)情況下是把“模式空間”中的內(nèi)容全部進(jìn)行顯示,p的意義在于把匹配到的行進(jìn)行顯示。

           所以其顯示的結(jié)果是“默認(rèn)的顯示內(nèi)容+p要顯示的內(nèi)容”。

           因此通常與-n選項一起使用,表示只顯示匹配到的行。

    3)a \text:append,表示在匹配到的行之后追加內(nèi)容

    4)i \text:insert,表示在匹配到的行之前追加內(nèi)容

    5)c \text:change,表示吧匹配到的行和給定的文本進(jìn)行交換

    6)s/regexp/replacement/flages:查找替換,把text替換為regexp匹配到的內(nèi)容(其中/可以用其他字符代替,例如@)

       可能會用到的特殊replacemen(通常replacement為固定的字符竄):

           \L:轉(zhuǎn)換后面的內(nèi)容第一個字母為小寫字母

           \l:后面的內(nèi)容全部轉(zhuǎn)換成小寫,直到遇到\E為止

           \U:轉(zhuǎn)換后面的內(nèi)容第一個字母為大寫字母

           \u:后面的內(nèi)容全部轉(zhuǎn)換成大寫,直到遇到\E為止

           \E:當(dāng)以\L或\U開始的時候,\E意味著停止字符的轉(zhuǎn)換

           詳情請參考:sed的官方文檔

           如果是replacement為變量時,用'$VAR'引用即可

       常用的flages:

           g:全局替換,默認(rèn)只替換第一個

           i: 不區(qū)分大小寫

           p:如果成功替換則打印

    7)w /path/to/somefile:將匹配到的文件另存到指定的文件中

    8)r /path/from/somefile:將讀取指定的文件內(nèi)容到匹配的行處(如果指定文件為多行時,追加到匹配行之后)


五、知識點練習(xí)

1、顯示文件中的偶數(shù)行:

    1)用first~step的方式來實現(xiàn),把奇數(shù)行刪除,自然顯示的事偶數(shù)行

blob.png

    2)不輸出默認(rèn)的顯示內(nèi)容,用p指定顯示偶數(shù)行

blob.png

2、在含有“ftp”這個行的前面加上“#This is a command”

blob.png

3、把以/sbin/nologin結(jié)尾的行的小寫字母全部替換成大寫

    1)先用/regexp/地址定界的來選定以/sbin/nologin結(jié)尾的行

#顯示所有以/sbin/nologin$結(jié)尾的行
# sed -n '\#/sbin/nologin$#p' test.txt

    2)查找替換

       查找所有的小寫字符[a-z]

       其中/\u&/中的&表示前面所匹配到的所有內(nèi)容,所以/\u&/g為前面所匹配到的小寫字母全部替換為大寫字母

blob.png

4、把/etc/man.config文件所有不以#開頭的行保存到/tmp/sed/man.txt的目錄中

其中多個腳本用-e來分別執(zhí)行,其實用;也可以實現(xiàn)多個腳本的連接。例如:

# sed -n -e '/^#/d;w /tmp/sed/man1.txt' /etc/man.config

blob.png

查看文件保存正常,/tmp/sed/man.txt,并且其顯示內(nèi)容也符合要求

blob.png

5、用sed命令修改/tmp/sed/inittab中的id:X:initdefault:修改為id:5:initdefault:(其中X為任意的數(shù)字)

blob.png

六、sed的知識擴展

在sed的工作原理圖中我們了解到,sed不僅存在模式空間,也存在一個保持空間(hold space)。顧名思義,保存空間是一段sed獨有的內(nèi)存空間片段,可以暫時存放一些數(shù)據(jù)。

其中與“保持空間”相關(guān)的編輯命令有:

    h:把模式空間中的內(nèi)容覆蓋到保存空間中的內(nèi)容

    H:把模式空間中的內(nèi)容追加到保存空間中(加在原有內(nèi)容之后)

    g:把保持空間中的內(nèi)容覆蓋到模式空間中的內(nèi)容

    G:把保持空間中的內(nèi)容追加到模式空間中(加在原有內(nèi)容之后)

    x:把模式空間中的內(nèi)容和保持空間中的內(nèi)容進(jìn)行交換

    d:刪除模式空間中的內(nèi)容

    D:如果模式空間中的內(nèi)容為多行時,刪除模式空間中的第一行

    n:讀取匹配到的行的下一行到模式空間中(覆蓋原內(nèi)容)

    N:讀取匹配到的行的下一行到模式空間中(追加在原內(nèi)容之后)

例如:顯示偶數(shù)行的時候就可以這樣實現(xiàn):sed -n 'n;p' FILE

練習(xí)1、把文件的相鄰兩行合并為一行

blob.png

練習(xí)2、

前提:/etc/services文件是記錄了服務(wù)與端口號之間的映射關(guān)系

1) 在此文件中選出21,22,25,53,80,443,8080的行并予以顯示

grep -E可以支持使用擴展正則表達(dá)式,所以可以使用|(或者)

blob.png

2)要求把右邊有#注釋的行的注釋信息追加到此行的上一行

# cd /tmp/sed
# vim script.txt     #創(chuàng)建sed命令腳本
#
# script.txt內(nèi)容如下
h                    #追加模式空間的內(nèi)容到保存空間
s@.*\(#.*\)@\1@      #有注釋內(nèi)容的行僅保留注釋的內(nèi)容,沒有注釋的行不做修改
s/^[^#].*//g         #把非#開頭的行給替換成空行
G                    #把保持空間中內(nèi)容追加到當(dāng)前行之后
//d                  #刪除所有空白行

執(zhí)行效果如下:

blob.png

3)刪除右側(cè)的注釋行,并保留以#行開頭的注釋行

在script中追加s/[[:space:]]\+#.*//

blob.png

4)服務(wù)與服務(wù)之間加入空白行

# 在行之后追加空白行的方法
# sed 'G' filename

blob.png

sed '/^#/!G;$d' 在非#開頭的行之加入空白行,之后最后一行會多出一個空白行,用sed '$d'刪除最后一行即可。


七、總結(jié)

sed是一款強大的文本處理工具,它的強大就是基于這些小命令。

Linux的哲學(xué)思想之一不就是,組合小任務(wù)來完成大任務(wù)。

只要基礎(chǔ)掌握扎實,即便再復(fù)雜的處理,也能一步一步慢慢地完成。

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評如潮的Linux云計算運維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機構(gòu)!