標籤:
引言:
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】