本文記錄的是自己在學習《Linux私房菜》中正則表達式的筆記。 關於行尾符$ 如果文件本身沒有內容,比如使用touch新建的文件,那麼$將會沒有意義。例如下麵操作: 先使用touch新建了一個test.txt文件,然後嘗試使用sed命令去在行尾增加內容,但是沒有成功(緊接著的cat命令沒有輸出任何東 ...
本文記錄的是自己在學習《Linux私房菜》中正則表達式的筆記。
關於行尾符$
如果文件本身沒有內容,比如使用touch新建的文件,那麼$將會沒有意義。例如下麵操作:
先使用touch新建了一個test.txt文件,然後嘗試使用sed命令去在行尾增加內容,但是沒有成功(緊接著的cat命令沒有輸出任何東西),然後我使用vim給test.txt手動增加了一行內容“add by vim”,然後再使用同樣的sed命令就成功了,如後續cat命令輸出結果。
命令sed
sed是一個十分有用的管道命令,功能很多,而且都是用的比較多的場景。
sed [-nefri] [動作]
- -n:安靜模式。預設情況下,所有向sed的stdin都會顯示在屏幕上,而若使用安靜模式,則只有經過sed特殊處理的行或者命令顯示在屏幕上
- -e:直接在命令行模式上進行sed的動作編輯
- -f:直接將sed的動作寫在一個文件內,-f filename則可以執行filename內的sed動作
- -r:使sed支持擴張正則表達式語法,預設為基礎正則表達式語法
- -i:直接修改讀取的文件內容,而不是在屏幕上輸出。預設是在屏幕上輸出,而源文件不受影響
下麵是動作說明,動作需要使用單引號‘’,且可以用兩個數字或者$來選擇進行動作的行數,‘[n1[,n2]]function’,比如'2,5d','2d','3,$d'這三種形式,分別表示選擇[2-5]行,第2行,[3-最後一行]。也可以使用正則表達式來選擇行,比如'/正則表達式/d',則將對符號正則表達式的行進行刪除動作。function有如下操作:
- a:新增。在a的後面必須接字元串,且不能全是空格的字元串,表示在當前行的下一行寫入這些數據
- c:替換。c的後面必須接字元串,這些字元串將替換n1,n2之間的行,即刪除行[n1,n2],然後在n1-1後面寫入這些字元串
- d:刪除。刪除行[n1,n2]
- i:插入。i的後面必須接字元串,這些字元串將出現當前行的上一行
- p:列印。將選擇的數據列印出來,就是顯示在屏幕上。通常與-n一起
- s:替換。直接進行替換工作,可以使用正則表達式,例如'1,20s/old/new/g'
關於對function的作用範圍,測試表明:
- 若沒有選擇,即例如‘a str’,對於a,d,i,p則表示選擇所有的行。而對於c,則並不是刪除所有行,然後只增加一行str,而是把所有行都替換為str
- 如果有選擇則,即例如‘1a str’,'1,3a str','2,$a str','$a str','/正則表達式/a str';對於a,d,i,p則表示選擇這些行進行動作。而對於c,若是使用[n1[,n2]]形式選擇的行,則刪除全部行,再增加一行str;而若是使用正則表達式選擇的行,則是把選擇的每一行都替換成str!
- 若文件為空文件,那麼這些功能都將無效果,包括增加類的命令a,i
使用a來增加多行:在每一行後面都必須使用反斜杠“\”來進行新行的增加,例如:test.txt中本來只有一行:this is a test file.,然後使用a增加了三行
使用sed刪除空行:sed -i '/^$/d' filename,解釋:-i表示直接修改文件而不在屏幕上顯示,/^$/使用的是正則表達式,在正則表達式中^表示行首,$表示行尾,行尾與行首之間沒有東西則是空行,d表示刪除。
sed命令有一個查找替換功能:
sed 's/要被替換的字元串/新的字元串/g' filename
其中,要“被替換的字元串”是使用正則表達式的,而對於“新的字元串”那肯定就是普通的字元。下麵是我做的一些測試。