Linux命令學習計劃【sed】

來源:互聯網
上載者:User

標籤:

引言:

Sed命令是linux裡用於文本行處理的命令。

為了便於說明,我在/usr/dict下建立了字典words並以此作為示範模板

先用nl 列印下words內容:

*列印篇:

Q1:如何列印某一行資料?

如果要列印第一行資料,則使用:

sed –n 1p words

如果要列印最後一行資料,則使用:

sed –n ‘$p’ words

注意的是:如果是某個具體的行號,並不需要加引號,如果含’$’等特殊字元或某些模式比對的時候需要加引號。

你會想,僅僅是能看到頭行和結尾行的資料,有什麼稀奇的?試想如果一個文本,比如一個‘龐大’的log,僅僅是要看第10000行的資料,怎麼去看?如果一頁頁去找會很麻煩,同時開啟很大的檔案去尋找也是不現實的。這時用sed命令就非常方便。看!

sed -n 10000p words

 

Q2:列印連續的行?

列印連續行只要這麼寫:

sed –n 2,6p words

表示列印2-6行的資料

列印從第5行道結尾的資料,這麼寫:

sed –n ‘5,$p’ words

 

Q2:怎樣列印不連續的行?

比如我想只列印第5、8、10資料:

這裡用到了“-e”參數,每個-e 後面都可以運算式+執行動作,sed按順序執行。

Q3:列印包含指定字元(模式比對)的行?

當我們在一個龐大的文檔中尋找資料時,往往不知道要尋找的東西在哪行,我們知道的可能是某行資料包含什麼字串或者符合什麼樣的規律,這時要用到模式比對,把要匹配的格式放在兩個’/’之間,如下:

/pattern-text/

。比如要查看含’abc’的行:

sed –n /abc/p words

 

要查看包含3個連續相同字元的行:

sed –n ‘/\(\w\)\1\1/p’ words

 

 

*新增篇

Q1:在某一行後添加新行要怎麼做?

比如sedtest下有三個指令碼: 

寫這些指令碼的人都是一個作者,作者寫完後發現有必要在源碼中留下自己的大名。於是他這樣做:

sed –in ‘1a #author is elvis’ sh01.sh sh02.sh sh03.sh

加上-i表示修改的內容直接‘寫回’文檔而不在螢幕輸出

1a表示在第一行後插入新行,這是因為第一行往往是’#!’行。也可以把1a換為2i,表示在第二行前插入一行(當然預設了一個指令檔至少有2行)

加上大名後作者還不滿意,想一次性地把版本和日期資訊加上並且加上一行注釋‘This is for test’。sed也能一次性地添加多行,可以直接在後面添加分行符號\n,也可以通過在shell中輸入【\+斷行符號】分開每行的輸入:

除此之外,sed還可以讀取一個文字檔的內容並追加到指定行的後面:

比如要在3個指令檔末尾追加sh04.sh的內容:

sed –in ‘$r sh04.sh’ sh01.sh sh02.sh sh03.sh

sh04.sh中寫了很多內容,包括定義了一些方法,比如sh04.sh中定義了bomb方法。通過上面的命令就可以把這個方法插入了3個指令碼的末尾。

*刪除篇

利用sed命令可以輕鬆刪除文字檔中指定的行。

用法是:sed n1,n2d textfilepath;或sed ‘/pattern-text/d’ textfilepath

比如:我想查看一個shell指令碼,但是不想看注釋,同時不列印空行,可以這麼做;

細心的你可能會發現我少加了”-n”參數,在列印和新增的時候通常要加上”-n”參數,因為”-n“表示是只輸出匹配的行。

我們改寫上面的案例,看下列印如果不加這項參數會怎樣。

咦?怎麼還是把所有的列印出來了?而且還重複列印了!

這是因為原始行在非安靜模式下是會輸出,顯示不符合我們想要的結果。加上”-n”就”安靜“多了!

由於刪除的動作,是顯示刪除後原始行的資料,所以不需要加”-n“,如果加了將看不到任何效果。

*修改篇

sed命令可以修改一個文字文件的資料。

1、  整行取代

sed n1,n2c textfilepath

比如我要把words中的空行用三個’#’代替,可以這麼做:

2、  局部修改

Regex是個利器,它成就了像sed,awk這樣的強大的文本工具。sed可以通過匹配修改一個文字文件中任何你想修改的地方,比如:

words中每一行單詞首字母都不是大寫,通過sed命令就可以完善這一點,看!

比如,我想把words中每個全數位單詞都加上”0x“首碼:

*番外篇

1、小結:

通過上面的介紹,總結sed的用法規律,

sed [–nrfe] + Regex或行號+執行動作 + 檔案,執行動作用a,c,i這類的字元標識。

同時sed也是一個管道命令,所謂管道(pipe)命令,簡單的理解是不僅可以產生資料,也可以接收和處理別的命令產生的資料。

比如一個文檔中有很多重複行,用sed定位行時沒必要把所有的重複行列印出來,這時可以先用uniq命令去除重複行,然後把去除重複後的資料交給sed處理:

2、擴充:

-e、-f、-r參數的含義和使用

有些人對sed中nrfe這4個參數不理解,其實理解它們不難,手冊+實踐就搞定。

-n上面已經說明了,這裡略過。

先用man sed看下參數的說明:

可以看到-e和-f的作用都是一樣,都是向命令列添加執行動作,只不過-e是直接在後面添加運算式,-f是指定一個指令檔。

在列印篇已經看到了-e的用法,對!一條sed命令可以連續接好幾個-e exp的,它告訴我們一條sed命令其實做很多事情。

比如修改篇中,我想同時實現轉換大寫字母和添加首碼的功能,就可以用-e參數實現:

-f的作用就是指定一個寫滿執行動作的檔案:

比如我寫了一個sed_print檔案,裡面寫了我要列印某幾行的命令:

我只要在sed命令後指定這個文檔就可以列印第2行、第5行、第8行的資料,是不是很方便

-r的作用是應用擴充的Regex

如果不加這個參數預設使用的基本的Regex,這樣有些文法是無法使用的,比如”+“和”?”。看看下面這個對比就知道了:

比如words不是按行分隔,而是按空格分隔,我想使其中的每個英文單詞的首字母大寫:

上面的Regex用到了“+“,所以必須加”-r“參數才可,否則就匹配不了,這也是我們在用sed命令時要十分小心的地方。

 

擴充的Regex到底擴充了哪些東西呢?

除了上面講的+和?外還有:

1、{m,n}字元次數匹配

2、|,OR匹配

3、(),分組和反向引用

 

Linux命令學習計劃【sed】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.