先來給一個案例:
#将old.sql檔案中的符号“|”替換為“,”,并儲存到test.sql檔案中
sed "s/|/,/g" "old.sql"> test.sql
#将test.sql檔案中的每一行最後的符号“,”删除
sed -i 's/,$//g' test.sql
#在test.sql檔案中每行的開頭添加左括号“(”
sed -i 's/^/(&/g' test.sql
#在test.sql檔案中每一行的末尾添右括号“)”
sed -i 's/$/&)/g' test.sql
#統計檔案old.sql的行數
c=`sed -n '$=' /home/work/BaikalDB/tpch/load/data_tbl/old.sql`
#在test.sql檔案的第3行~3+99行的末尾添右括号“,”
sed -i "3,+99 s/$/&,/" test.sql
#在test.sql檔案的第n行的開頭添加“insert into table values”,這裡的可以為具體的數字,也可以為變量的值,如j變量:${j}
sed -i "niinsert into table values " test.sql
#将test.sql檔案的最後一行末尾的“,”換成“;”,這裡的可以為具體的數字,也可以為變量的值,如j變量:${j}
sed -i "ns/,$/;/" test.sql
一個簡單的入門
如圖,一個簡單的sed指令包含三個主要部分:參數、範圍、操作。要操作的檔案,可以直接挂在指令行的最後。除了指令行,sed也可以通過-f參數指定一個sed腳本,這個屬于進階用法,不做過多描述。
有些示例指令我會重複多次,聰明如你一定能發現其中規律,有時連解釋都用不着。
參數
-n 這個參數是--quiet或者--silent的意思。表明忽略執行過程的輸出,隻輸出我們的結果即可。
我們常用的還有另外一個參數 :-i。
使用此參數後,所有改動将在原檔案上執行。你的輸出将覆寫原檔案。非常危險,一定要注意。
範圍
1,4 表示找到檔案中1,2,3,4行的内容。
這個範圍的指定很有靈性,請看以下示例(請自行替換圖中的範圍部分)。
5 選擇第5行。
2,5 選擇2到5行,共4行。
1~2 選擇奇數行。
2~2 選擇偶數行。
2,+3 和2,5的效果是一樣的,共4行。
2,$ 從第二行到檔案結尾。
範圍的選擇還可以使用正則比對。請看下面示例。
/sys/,+3 選擇出現sys字樣的行,以及後面的三行。
/\^sys/,/mem/ 選擇以sys開頭的行,和出現mem字樣行之間的資料。
為了直覺,下面的指令一一對應上面的介紹,範圍和操作之間是可以有空格的。
操作
最常用的操作就是p,意思就是列印。比如,以下兩個指令就是等同的:
除了列印,還有以下操作,我們來說常用的。
p 對比對内容進行列印。
d 對比對内容進行删除。這個時候就要去掉-n參數了,想想為什麼。
w 将比對内容寫入到其他地方。
a,i,c等操作雖基本但使用少,不做介紹。我們依然拿一些指令來說明。
替換模式
以上是sed指令的常用比對模式,但它還有一個強大的替換模式,意思就是查找替換其中的某些值,并輸出結果。使用替換模式很少使用-n參數。
替換模式的參數有點多,但第一部分和第五部分都是可以省略的。替換後會将整個文本輸出出來。
前半部分用來比對一些範圍,而後半部分執行替換的動作。
範圍
這個範圍和上面的範圍文法類似。看下面的例子。
/sys/,+3 選擇出現sys字樣的行,以及後面的三行。
/\^sys/,/mem/ 選擇以sys開頭的行,和出現mem字樣行之間的資料。
具體指令為:
指令
這裡的指令是指s。也就是substitute的意思。
查找比對
查找部分會找到要被替換的字元串。這部分可以接受純粹的字元串,也可以接受正規表達式。看下面的例子。
a 查找範圍行中的字元串a。
[a,b,c] 從範圍行裡查找字元串a或者b或者c。
指令類似:
替換
是時候把找出的字元串給替換掉了。本部分的内容将替換查找比對部分找到的内容。
可惜的是,這部分不能使用正則。常用的就是精确替換。比如把a替換成b。
但也有進階功能。和java或者python的正則api類似,sed的替換同樣有Matched Pattern的含義,同樣可以得到Group,不深究。常用的替位符,就是&。
&号,再重複一遍。當它用在替換字元串中的時候,代表的是原始的查找比對資料。
[&] 表明将查找到的資料使用[]包圍起來。
“&” 表明将查找的資料使用””包圍起來。
下面這條指令,将會把檔案中的每一行,使用引号包圍起來。
flag 參數
這些參數可以單個使用,也可以使用多個,僅介紹最常用的。
g 預設隻比對行中第一次出現的内容,加上g,就可以全文替換了。常用。
p 當使用了-n參數,p将僅輸出比對行内容。
w 和上面的w模式類似,但是它僅僅輸出有變換的行。
i 這個參數比較重要,表示忽略大小寫。
e 表示将輸出的每一行,執行一個指令。不建議使用,可以使用xargs配合完成這種功能。
看兩個指令的文法:
好玩
由于正則的關系,很多字元需要轉義。你會在腳本裡做些很多\\,\*之類的處理。你可以使用|^@!四個字元來替換\。
比如,下面五個指令是一樣的。
注意:前半部分的範圍是不能使用這種方式的。我習慣使用符号@。
其他
正規表達式
可以看到,正規表達式在指令行中無處不在。以下,緊做簡要說明。
^ 行首
$ 行尾
. 單個字元
* 0個或者多個比對
+ 1個或者多個比對
? 0個或者1個比對
{m} 前面的比對重複m次
{m,n} 前面的比對重複m到n次
\ 轉義字元
[0-9] 比對括号中的任何一個字元,or的作用
| or,或者
\b 比對一個單詞。比如\blucky\b 隻比對單詞lucky
參數i
上面已經簡單介紹了參數i,它的作用是讓操作在原檔案執行。無論你執行了啥,原始檔案都将會被覆寫。這是非常危險的。
通過加入一個參數,可以将原檔案做個備份。
以上指令會對原file檔案生效,并生成一個file.bak檔案。強烈建議使用i參數同時指定bak檔案。
表演一下
我們通過兩個指令,來稍微看下sed和其他指令組合起來的威力。
輸出長度不小于50個字元的行
統計檔案中有每個單詞出現了多少次
查找目錄中的py檔案,删掉所有行級注釋
檢視第5-7行和10-13行
僅輸出ip位址
End
Linux下shell腳本中信号捕獲和函數練習腳本之ping一個網段
該腳本主要的目的是練習在Linux bash腳本中捕獲信号,順便練習一下函數的使用,還有就是終止一個正在運作的程式後,該程式打開的檔案的後續處理問題等等!腳本功能: ping一個網段内的IP,檢測哪 ...
linux下shell 腳本 中windows換行符換成linux換行符
sed -i 's/\r//' filename window下預設是 \r\n linux下是\n unix下是\r
詳解Linux互動式shell腳本中建立對話框執行個體教程_linux伺服器
本教程我們通過實作來講講Linux互動式shell腳本中建立各種各樣對話框,對話框在Linux中可以友好的提示操作者,感興趣的朋友可以參考學習一下. 當你在終端環境下安裝新的軟體時,你可以經常看到資訊 ...
Linux/Unix shell 腳本中調用SQL,RMAN腳本
Linux/Unix shell腳本中調用或執行SQL,RMAN 等為自動化作業以及多次反複執行提供了極大的便利,是以通過Linux/Unix shell來完成Oracle的相關工作,也是DBA必不可 ...
shell腳本中sqlite3指令查詢資料庫失敗傳回空,并将錯誤資訊列印到标準錯誤輸出
shell腳本中sqlite3指令查詢資料庫失敗傳回空,并将錯誤資訊列印到标準錯誤輸出 如: #/bin/sh local ret='sqlite3 test.db "select test ...
linux下shell腳本執行jar檔案
最近在搞一個shell腳本啟動jar檔案個關閉jar檔案的東東.搞得我都蛋疼了.今天晚上終于弄好了 話說,小弟的linux隻是剛入門,經過各方查資料終于搞定了.話不多說,下面開始上小弟寫的shell腳 ...
linux下shell腳本學習
在Linux系統中,雖然有各種各樣的圖形化接口工具,但是sell仍然是一個非常靈活的工具.Shell不僅僅是指令的收集,而且是一門非常棒的程式設計語言.您可以通過使用shell使大量的任務自動化,shel ...
shell腳本中常用指令
1 Shell中的特殊符号 1.1 $ 美元符号.用來表示變量的值.如變量NAME的值為Mike,則使用$NAME就可以得到“Mike”這個值. 1.2 ...
linux下shell腳本啟動jar包
本文采用的jar包是通過idea下maven打包的springboot項目. 寫這個shell腳本是為了在linux下友善啟動jar包時不用輸入太多的shell指令,将啟動腳本的一系列shell指令整 ...
随機推薦
String.prototype運用
1.去掉字元串前後空格 String.prototype.ltrim = function () { return this.replace(/^\s+/, ""); } Stri ...
在python中使用圖形庫matplotlib
matplotlib is a python 2D plotting library which produces publication quality figures in a variety o ...
JBOSS通過Apache負載均衡方法一:使用mod_jk
JBOSS通過Apache負載均衡方法一:使用mod_jk 本文第一.二節分别對Linux環境下前端使用Apache以及windows環境下前端使用IIS通過AJP協定和後端的JBOSS通信實作負 ...
HDU 1280 前m大的數【哈希入門】
題意:中文的題目= =将各種組合可能得到的和作為下标,然後因為不同組合得到的和可能是一樣的, 是以再用一個數組num[]數組,就可以将相同的和都記錄下來 #include
HDU 4721 Food and Productivity (二分+樹狀數組)
轉載請注明出處,謝謝http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 題意 :給出n * m的格子,每個格子有兩個屬性f ...
vue 通過自定義指令實作 置頂操作;
項目需求:要求目前項目每個頁面滑到超出一屏的距離時,出現 backTop 按鈕,點選則回到最頂端:俗稱置頂操作: 因為涉及到的頁面較多,每個頁面都加肯定顯得重複累贅,最終想到了 Vue 的自定義指令 ...
.net core在Linux下擷取AD域資訊
.net core在Linux下擷取AD域資訊 .net Core 2.1.4 .net core現在System.DirectoryServices隻支援Windows平台下使用. 參考: http ...
cProfile——Python性能分析工具
Python自帶了幾個性能分析的子產品:profile.cProfile和hotshot,使用方法基本都差不多,無非子產品是純Python還是用C寫的.本文介紹cProfile. 例子 import t ...
Understanding the managed heap
Understanding the managed heap Another common problem faced by many Unity developers is the unexpe ...
iOS 線程操作庫 PromiseKit
iOS 線程操作庫 PromiseKit 官網:http://promisekit.org/ github:https://github.com/mxcl/PromiseKit/tree/master ...