日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sed基本用法

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sed基本用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

一、初識sed

sed:Stream Editor

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


二、初識sed的工作原理

前提:首先對于一個文本文件來說,它是由至上而下的一行或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的方式來實現,把奇數行刪除,自然顯示的事偶數行

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

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

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

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

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

? ? 2)查找替換

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

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

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

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

1

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

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


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

六、sed的知識擴展

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

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

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

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

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

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

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

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

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

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

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

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

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

練習2、

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

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

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

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

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

執行效果如下:

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

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

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

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

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


七、總結

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

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

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

轉載于:https://blog.51cto.com/wenzengliu/1660012

總結

以上是生活随笔為你收集整理的sed基本用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。