久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

sed的基本用法詳解

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

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

今天我們主要是圍繞sed來進行分析。

一、初識sed

sed:Stream Editor

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


二、初識sed的工作原理

blob.png

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

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

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

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

4、第一行處理結束。從新讀取第二行的內容進行處理,直到最后一行。


三、sed命令的基本語法

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

   常用的選項:

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

       -i: 直接編輯原文件,默認不對原文件進行操作

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

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

       -r: 使用擴展正則表達式


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

1、地址定界:

    1)#:#為數字,指定要進行處理操作的行

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

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

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

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

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

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

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

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

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

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

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

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

2、常用的編輯命令:

    1)d:刪除匹配到的行

    2)p:打印模式空間中的內容

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

           所以其顯示的結果是“默認的顯示內容+p要顯示的內容”。

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

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

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

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

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

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

           \L:轉換后面的內容第一個字母為小寫字母

           \l:后面的內容全部轉換成小寫,直到遇到\E為止

           \U:轉換后面的內容第一個字母為大寫字母

           \u:后面的內容全部轉換成大寫,直到遇到\E為止

           \E:當以\L或\U開始的時候,\E意味著停止字符的轉換

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

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

       常用的flages:

           g:全局替換,默認只替換第一個

           i: 不區分大小寫

           p:如果成功替換則打印

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

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


五、知識點練習

1、顯示文件中的偶數行:

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

blob.png

    2)不輸出默認的顯示內容,用p指定顯示偶數行

blob.png

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

blob.png

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

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

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

    2)查找替換

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

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

blob.png

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

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

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

blob.png

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

blob.png

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

blob.png

六、sed的知識擴展

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

其中與“保持空間”相關的編輯命令有:

    h:把模式空間中的內容覆蓋到保存空間中的內容

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

    g:把保持空間中的內容覆蓋到模式空間中的內容

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

    x:把模式空間中的內容和保持空間中的內容進行交換

    d:刪除模式空間中的內容

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

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

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

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

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

blob.png

練習2、

前提:/etc/services文件是記錄了服務與端口號之間的映射關系

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

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

blob.png

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

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

執行效果如下:

blob.png

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

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

blob.png

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

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

blob.png

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


七、總結

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

Linux的哲學思想之一不就是,組合小任務來完成大任務。

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

相關新聞

歷經多年發展,已成為國內好評如潮的Linux云計算運維、SRE、Devops、網絡安全、云原生、Go、Python開發專業人才培訓機構!

    1. 主站蜘蛛池模板: 保山市| 大名县| 天峻县| 临海市| 平顺县| 郓城县| 泸水县| 布拖县| 合川市| 云梦县| 溧阳市| 哈巴河县| 教育| 威信县| 嵊泗县| 三河市| 清河县| 铜川市| 阜宁县| 宜州市| 包头市| 定日县| 博爱县| 郁南县| 屯昌县| 华池县| 吉木萨尔县| 且末县| 柏乡县| 山阳县| 芒康县| 高陵县| 开封市| 昌江| 宁明县| 历史| 金湖县| 宁陵县| 德格县| 玉溪市| 秦安县|