<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          干貨!上古神器 sed 教程詳解,小白也能看的懂

          共 5130字,需瀏覽 11分鐘

           ·

          2021-02-02 07:46


          目錄:

          介紹工作原理正則表達(dá)式基本語法數(shù)字定址和正則定址基本子命令實戰(zhàn)練習(xí)

          介紹

          熟悉 Linux 的同學(xué)一定知道大名鼎鼎的 Linux 三劍客,它們是 grep、awk、sed,我們今天要聊的主角就是 sed。

          sed 全名叫 stream editor,流編輯器,用程序的方式來編輯文本,與 vim 的交互式編輯方式截然不同。它的功能十分強大,加上正則表達(dá)式的支持,可以進(jìn)行大量的復(fù)雜文本的編輯操作。

          實際上 sed 提供的功能非常復(fù)雜,有專門的書籍講解它。本文不會講 sed 的全部東西,只會從 sed 的工作原理、常見使用方法等方面進(jìn)行說明和講解,同時也會給出大量的實踐用例來幫助更好的理解 sed 基本用法。文中的知識點真正掌握后,足以應(yīng)付平時工作中的基本需求。

          它有自己的使用場景:

          • 自動化程序中,不適合交互方式編輯的;

          • 大批量重復(fù)性的編輯需求;

          • 編輯命令太過復(fù)雜,在交互文本編輯器難以輸入的情況;

          工作原理

          sed 作為一種非交互式編輯器,它使用預(yù)先設(shè)定好的編輯指令對輸入的文本進(jìn)行編輯,完成之后輸出編輯結(jié)果。

          簡單描述 sed 工作原理:

          • sed 從輸入文件中讀取內(nèi)容,每次處理一行內(nèi)容,并把當(dāng)前的一行內(nèi)容存儲在臨時的緩沖區(qū)中,稱為 模式空間。

          • 接著用 sed 命令處理緩存區(qū)中的內(nèi)容;

          • 處理完畢后,把緩存區(qū)的內(nèi)容送往屏幕;

          • 接著處理下一行;

          這樣不斷重復(fù),直到文件末尾,文件內(nèi)容并沒有改變,除非你使用重定向輸出或指定了 i 參數(shù)

          正則表達(dá)式

          sed 基本上就是在玩正則表達(dá)式模式匹配,所以,會玩 sed 的人,正則表達(dá)式能力一般都比較強。正則表達(dá)式內(nèi)容相對較多,本節(jié)不會重點講解正則表達(dá)式。

          為了能夠讓大部分朋友比較輕松地學(xué)習(xí)本文知識,這里還是簡單介紹下正則表達(dá)式的基本內(nèi)容。如果是專門做正則編程開發(fā)的,可以去買本正則的書籍來看。

          (一)基本正則表達(dá)式

          • .,表示匹配任意一個字符,除了換行符,類似 Shell 通配符中的 ?;

          • *,表示前邊字符有 0 個或多個;

          • .*,表示任意一個字符有 0 個或多個,也就是能匹配任意的字符;

          • ^,表示行首,也就是每一行的開始位置,^abc 匹配以 abc 開頭的字符串;

          • $,表示行尾,也就是每一行的結(jié)尾位置,}$ 匹配以大括號結(jié)尾的字符串;

          • {},表示前邊字符的數(shù)量范圍,{2},表示重復(fù) 2 次,{2,}重復(fù)至少 2次,{2,4} 重復(fù) 2-4 次;

          • [],括號中可以包含表示字符集的表達(dá)式,使用方法大概如下幾種

          (二)擴展正則表達(dá)式

          擴展正則表達(dá)式使用頻率上沒有基本表達(dá)式那么高,但依然很重要,很多情況下沒有擴展正則是搞不定的,sed 命令使用擴展正則時需要加上選項 -r

          • ?:表示前置字符有 0 個或 1 個;

          • +:表示前置字符有 1 個或多個;

          • |:表示匹配其中的一項即可;

          • ():表示分組,(a|b)b 表示可以匹配 ab 或 bb 子串,且命令表達(dá)式中可以通過 \1、\2 來表示匹配的變量

          • {}:和基本正則中的大括號中意義相同,只不過使用時不用加 轉(zhuǎn)義符號;

          基本語法

          先介紹下 sed 的基本語法。

          sed [選項] 'command' filename

          選項部分,常見選項包括:-n-e、-i、-f-r 等。

          command 子命令格式:

          [地址1, 地址2] [函數(shù)] [參數(shù)(標(biāo)記)]

          選項簡單說明:

          • -n,表示安靜模式。默認(rèn) sed 會把每行內(nèi)容處理完畢后打印到屏幕上,加上選項后就不會輸出到屏幕上。

          • -e,如果需要用 sed 對文本內(nèi)容進(jìn)行多種操作,則需要執(zhí)行多條子命令來進(jìn)行操作;

          • -i,默認(rèn) sed 只會處理模式空間的副本內(nèi)容,不會直接修改文件,如果需要修改文件,就要指定 -i 選項;

          • -f,如果命令操作比較多時,用 -e 會有點力不從心,這時需要把多個子命令寫入腳本文件,使用 -f 選項指定執(zhí)行該腳本;

          • -r:如果需要支持?jǐn)U展正則表達(dá)式,那么需要添加 -r 選項;

          數(shù)字定址和正則定址

          默認(rèn)情況下 sed 會對每一行內(nèi)容進(jìn)行匹配、處理、輸出,有時候我們不需要對所有內(nèi)容進(jìn)行操作,只需要修改一種一部分,比如 1-10 行,偶數(shù)行,或包括 hello 字符串的行。

          這種情況下,就需要我們?nèi)ザㄎ惶囟ǖ男衼磉M(jìn)行處理,而不是全部內(nèi)容,這里把定位指定的行叫做 定址。

          (一)數(shù)字定址

          數(shù)字定址其實就是通過數(shù)字去指定要操作的行,有幾種方式,每種方式都有不同的應(yīng)用場景。

          #?只將第4行中hello替換為A
          $?sed?'4s/hello/A/g'?file.txt
          #?將第2-4行中hello替換為A
          $?sed?'2,4s/hello/A/g'?file.txt
          #?從第2行開始,往下數(shù)4行,也就是2-6行
          $?sed?'2,+4s/hello/A/g'?file.txt
          #?將最后1行中hello替換為A
          $?sed?'$s/hello/A/g'?file.txt
          #?除了第1行,其它行將hello替換為A
          $?sed?'1!s/hello/A/g'?file.txt

          (二)正則定址

          正則定址,是通過正則表達(dá)式的匹配來確定需要處理編輯哪些行,其它行就不需要處理

          #?將匹配到hello的行執(zhí)行刪除操作,d?表示刪除
          $?sed?'/hello/d'?file.txt
          #?刪除空行,"^$"?表示空行
          $?sed?'/^$/d'?file.txt
          #?將匹配到以ts開頭的行到以te開頭的行之間所有行進(jìn)行刪除
          $?sed?'/^ts/,/^te/d'?file.txt

          (三)數(shù)字定址和正則定址混用

          數(shù)字定址和正則定址可以配合使用

          #?匹配從第1行到ts開頭的行,把匹配的行執(zhí)行刪除
          $?sed?'1,/^ts/d'?file.txt

          基本子命令

          (一)替換子命令s

          子命令 s 為替換子命令,是平時 sed 使用最多的命令,因為支持正則表達(dá)式,功能很強大,基本可以替代 grep 的基本用法。

          基本語法:

          [address]s/pat/rep/flags

          替換子命令基本用法

          #?將每行的hello替換為HELLO,只替換匹配到的第一個
          $?sed?'s/hello/HELLO/'?file.txt
          #?將匹配到的hello全部替換為HELLO,g表示替換一行所有匹配到的
          $?sed?'s/hello/HELLO/g'?file.txt
          #?將第2次匹配到的hello替換
          $?sed?'s/hello/A/2'?file.txt
          #?將第2次后匹配到的所有都替換
          $?sed?'s/hello/A/2g'?file.txt
          #?在行首加#號
          $?sed?'s/^/#/g'?file.txt
          #?在行尾加?xùn)|西
          $?sed?'s/$/xxx/g'?file.txt

          正則表達(dá)式的簡單使用

          #?使用擴展正則表達(dá)式,結(jié)果為:A
          $?echo?"hello?123?world"?|?sed?-r?'s/[a-z]+?[0-9]+?[a-z]+/A/'

          #?This?is?what?I?meant
          #?要求:去掉上述html文件中的tags
          $?sed?'s/<[^>]*>//g'?file.txt

          多個匹配

          #?將1-3行的my替換為your,且3行以后的This替換為That
          $?sed?'1,3s/my/your/g;?3,$s/This/That/g'?my.txt
          #?等價于
          $?sed?-e?'1,3s/my/your/g'?-e?'3,$s/This/That/g'?my.txt

          使用匹配到的變量

          #?將匹配到的字符串前后加雙引號,結(jié)果為:My "name" chopin
          #?"&"表示匹配到的整個結(jié)果集
          $?echo?"My?name?chopin"?|?sed?'s/name/"&"/'

          #?如下命令,結(jié)果為:hello=world,"\1"和"\2"表示圓括號匹配到的值
          $?echo?"hello,123,world"?|?sed?'s/\([^,]\),.*,\(.*\)/\1=\2/'

          其它幾個常見用法

          #?只將修改匹配到行內(nèi)容打印出來,-n關(guān)閉了模式空間的打印模式
          $?sed?-n?'s/i/A/p'?file.txt

          #?替換是忽略大小寫,將大小寫i替換為A
          $?sed?-n?'s/i/A/i'?file.txt

          #?將替換后的內(nèi)容另存為一個文件
          $?sed?-n?'s/i/A/w?b.txt'?file.txt
          $?sed?-n?'s/i/A/'?file.txt?>?b.txt

          注意,sed 修改匹配到的內(nèi)容后,默認(rèn)行為是不保存到原文件,直接輸出修改后模式空間的內(nèi)容,如果要修改原文件需要指定 -i 選項。

          (二)追加行子命令a

          子命令 a 表示在指定行下邊插入指定的內(nèi)容行;

          #?將所有行下邊都添加一行內(nèi)容A
          $?sed?'a?A'?file.txt
          #?將文件中1-2行下邊都添加一行內(nèi)容A
          $?sed?'1,2a?A'?file.txt

          (三)插入行子命令i

          子命令 ia 使用基本一樣,只不過是在指定行上邊插入指定的內(nèi)容行

          #?將文件中1-2行上邊都添加一行內(nèi)容A
          $?sed?'1,2i?A'

          (四)替換行子命令c

          子命令 c 是表示把指定的行內(nèi)容替換為自己需要的行內(nèi)容

          #?將文件所有行都分別替換為A
          $?sed?'c?A'?file.txt
          #?將文件中1-2行內(nèi)容替換為A,注意:兩行內(nèi)容變成了一行A
          $?sed?'1,2c?A'?file.txt
          #?將1-2行內(nèi)容分別替換為A行內(nèi)容
          $?sed?'1,2c?A\nA'?file.txt

          (五)刪除行子命令d

          子命令 d 表示刪除指定的內(nèi)容行,這個很容理解

          #?將文件中1-3行內(nèi)容刪除
          $?sed?'1,3d'?file.txt
          #?將文件中This開頭的行內(nèi)容刪除
          $?sed?'/^This/d'?file.txt

          (六)設(shè)置行號子命令=

          子命令 =,可以將行號打印出來

          #?將指定行上邊顯示行號
          $?sed?'1,2='?file.txt
          #?可以將行號設(shè)置在行首
          $?sed?'='?file.txt?|?sed?'N;s/\n/\t/'

          (七)子命令N

          子命令 N,把下一行內(nèi)容納入當(dāng)緩存區(qū)做匹配,注意的是第一行的 \n 仍然保留

          其實就是當(dāng)前行的下一行內(nèi)容也讀進(jìn)緩存區(qū),一起做匹配和修改,舉個例子吧

          #?將偶數(shù)行內(nèi)容合并到奇數(shù)行
          $?sed?'N;s/\n//'?file.txt

          哈哈,是不是很簡單?

          實戰(zhàn)練習(xí)

          掌握了上邊的基礎(chǔ)命令操作后,基本上可以滿足平時 95% 的需求啦。sed 還有一些高級概念,比如:模式空間、保持空間、高級子命令、分支和測試等,平時使用概率非常小,本文就暫不講解了,有需要的同學(xué)可以私信我一起交流學(xué)習(xí)哈。

          學(xué)習(xí)了這么多基礎(chǔ)用法后,只要你勤加練習(xí),多實踐,多使用,一定可以得心應(yīng)手,極大提高的文本處理效率。下邊我簡單再給出一些比較實用的操作實踐,希望對大家有幫助。

          1. 刪除文件每行的第二個字符

          $?sed?-r?'s/(.)(.)(.*)$/\1\3/'?file.txt

          2. 交換每行的第一個字符和第二個字符

          $?sed?-r?‘s/(.)(.)(.*)/\2\1\3/’?file.txt

          3. 刪除文件中所有的數(shù)字

          $?sed?'s/[0-9]//g'?file.txt

          4. 用制表符替換文件中出現(xiàn)的所有空格

          $?sed?-r?'s/?+/\t/g'?file.txt

          5. 把所有大寫字母用括號()括起來

          $?sed?-r?'s/([A-Z])/(\1)/g'

          6. 隔行刪除

          $?sed?'0~2go7utgvlrp'?file.txt

          7. 刪除所有空白行

          $?sed?'/^$/d'?file.txt

          好了,以上是 sed 命令常用的全部內(nèi)容。想要熟練掌握,只有多實踐,多練習(xí)正則表達(dá)式的使用,一旦熟練掌握后,相信在日后工作中一定會產(chǎn)生巨大作用的。

          謝謝大家,我是肖邦,歡迎關(guān)注后續(xù)的精彩內(nèi)容。

          良許個人微信


          添加良許個人微信即送3套程序員必讀資料


          → 精選技術(shù)資料共享

          → 高手如云交流社群





          本公眾號全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲?。?/span>

          推薦閱讀:

          17 張程序員壁紙(使用頻率很高)

          16 歲高中生把 iPhone 7 改造成 Linux 服務(wù)器

          為什么黑客從不用鼠標(biāo),一直在敲鍵盤?看完長見識了


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復(fù)「1024」,即可免費獲?。。?/span>


          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产麻豆精品视频 | 五月丁香激情综合 | 成人性爱福利视频在线 | 少妇大战黑人无套A片 | 中国美女一级片 |