馬哥學習-----李洋個人筆記之--sed用法
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”
(pattern space),接著用sed命令處理緩沖區中的內容,如果讀入的行不符合需求,則不處理直接把內容送往屏幕,
符合需求的內容處理完成後,把緩沖區的內容送往屏幕。然後讀入下行,執行下一個循環。
如果沒有使諸如‘D’的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重復,
直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。沒有使用w選項的話,所有的改變只保留在默認輸出
上(屏幕),原文件內並不做任何改動.
功能:主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
用法:
sed [option]... ‘script‘ inputfile...
sed+選項+地址命令+輸入文件(可以為多個),其中地址命令可以省略,直接sed+輸入文件效果類似於cat。
常用選項:
-n:不輸出模式空間內容到屏幕,即不自動打印,但是後面可以跟#p來指定打印第幾行
sed -n ‘3p‘ 123.txt
打印123.txt的第三行。
p: 打印 ,直接sed + ‘p‘ + 文件的話,會把指定文件打印兩次.因為sed默認就是輸出,p又指定打印一次.
而sed + #p + 文件的話,則會將指定行打印2次,其余行打印一次.
-e: 多點編輯,即可以指定多個規則.
-f:/PATH/SCRIPT_FILE: 從指定文件中讀取編輯腳本
-r: 支持使用擴展正則表達式
-i.bak: 備份文件並原處編輯,只有加了i,所有的設置才會在原文件中生效.加上-i.bak後,會自動創建出
以原名件名.bak的備份文件,原文件內容被替換,但備份文件內容與被修改前一樣.(.bak可以改成任意字符串)
script:‘地址命令’
地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:
#: 指定的行,$:最後一行
sed 123.txt |sed 1p
打印第一行,不能用正則的^來代替第一行. 因為事先不知道一共有多少行,所以$p還能表達最後一行的意思.
/pattern/:被此處模式所能夠匹配到的每一行.
cat 123.txt |sed -n /abc/p
打印123.txt當中,包括abc字符的行. 不能使用sed打開文件後,再傳遞給sed.
(3) 地址範圍:
#,#
cat 123 |sed -n 3,5p
打印出123文件中,第三行到第五行的內容.
#,+#
cat 123 |sed -n 3,+1p 只支持加+.不支持減-.
打印出123文件中,第三行及隨後的一行.
/pat1/,/pat2/
cat 123 |sed -n /who/,/which/p
打印出123文件中,從who開始,which]結尾中間的所有行數.
#,/pat1/
cat 123 |sed -n 1,/which/p
打印出123文件中,第一行到which結尾中間的所有行數.
(4) ~:步進
1~2 奇數行
seq 1 10 |sed -n 1~2p
1
3
5
7
9
2~2 偶數行
seq 1 10 |sed -n 2~2p
2
4
6
8
10
編輯命令:
p:打印當前模式空間內容,追加到默認輸出之後,使用p的時候要把-n加上,否則會輸出兩遍。
d: 刪除模式空間匹配的行,並立即啟用下一輪循環
seq 1 3|sed 2d
1 3 刪除指定的行數。
a []text:在指定行後面追加文本,支持使用\n實現多行追加
cat 123 | sed 2a7254891 在第二行的尾部,追加新的一行,內容為7254891.
cat 123 | sed 2a7254891\n123456
在第二行的尾部,追加新的一行,內容為7254891n123456
cat 123 | sed "2a7254891\n123456"
在第二行的尾部,追加新的二行,內容分別為7254891和123456(另起一行).
cat 123 | sed "2,3a77777"
將123文件中,第二行和第三行後面分別加上77777.
i []text:在行前面插入文本,和a相反.
c []text:替換行為單行或多行文本
cat 123 | sed "2c77777\n123"
從第二行開始,將77777替換為原來第二行的內容,並在下方追加一行123,原來的第三行變為第四行.
cat 123 | sed "2,3c77777
將123文件中的第二,第三行內容,替換為一行,內容為77777.
w /path/somefile: 保存模式匹配的行至指定文件
cat 123 |sed w/app/321
將123文件在模式空間的內容,另存為321,保存至/app目錄下.
r /path/somefile:讀取指定文件的文本至模式空間中
cat 123 |sed w321
將321的內容,逐行追加到123的行尾,如果有指定匹配項,則在匹配項後追加.
註意:不指定位置的話,追加方式為逐行追加(即在123的每一行下方,都追加一次全部的321內容.包括空行).
cat 123 |sed 2w321
將321文件的內容,追加到123文件的第二行尾部.
匹配到的行後
=: 為模式空間中的行打印行號
!:模式空間中匹配行取反處理
sed工具
s///:查找替換,支持使用其它分隔符,s@@@,s###
替換標記:
g: 行內全局替換 s/替換內容/g,如果想忽略大小寫,可以在g後面加上i,變為s/替換內容/gi即可.
替換一行中的某一部分.
格式:sed ‘s/要替換的字符串/新的字符串/g‘ (要替換的字符串可以用正則表達式)
cat 123 |sed ‘s/who/i/g‘ 將123文本中的who,替換為i.
cat 123 |sed ‘1,3s/who/i/g‘ ,將123文本中的第一行和第三行的who替換為i.
替換匹配行中的某個字符串
格式sed -i ‘/匹配字符串/s/匹配字符串/替換目標字符串/g‘ filename
cat 123 | sed -i ‘/aaa/s/aaa/apple/g‘
將123文件中的aaa,替換為apple
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
例子:
sed ‘2p’ /etc/passwd
第二行打印2次,其余行打印一次.
sed –n ‘2p’ /etc/passwd
只打印第二行.
sed –n ‘1,4p’ /etc/passwd
只打印1--4行.
sed –n ‘/root/p’ /etc/passwd
只打印包含root的行.
sed –n ‘2,/root/p’ /etc/passwd
從2行開始,只打印包含root的行.
sed-n ‘/^$/=’ file
顯示空行行號
sed–n–e ‘/^$/p’–e ‘/^$/=’ file
先打印所有空行,並把空行打上行號.
sed ‘/root/a\superman’ /etc/passwd行後
將/etc/passwd文件中,所有root的行後,追加一行內容為superman的行.
sed ‘/root/i\superman’ /etc/passwd 行前
將/etc/passwd文件中,所有root的行前,追加一行內容為superman的行.
sed ‘/root/c\superman’ /etc/passwd 代替行
將/etc/passwd文件中,所有root的行,替換內容為superman的行.
sed ‘/^$/d’ file
刪除所有空行.
sed ‘1,10d’ file
刪除第一行到第十行.
nl /etc/passwd | sed ‘2,5d’ nl會將打開的文本,自動加上行號.
刪除第二到第五行
nl /etc/passwd | sed ‘2a tea’
在第二行後追加一行,內容為 tea(沒有空格)
sed ‘s/test/mytest/g‘ example
將example文件當中,所有的test替換為mytest。
sed –n ‘s/root/&superman/p’ /etc/passwd 這裏的&符號相當於互相引用,&引用前方的詞.
將passwd文件中,root單詞後方加上superman。,變為rootsuperman.
sed –n ‘s/root/superman&/p’ /etc/passwd 單詞前
將passwd文件中,root單詞前方加上superman。,變為supermanroot.
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
將pets中的dog換成cat,再將hi換成lo.
sed –i.bak ‘s/dog/cat/g’ pets
sed高級編輯.sed有模式空間(臨時緩存區)及保持空間(相當於倉庫).
Pattern Space相當於車間,sed把流內容在這裏進行處理,Hold Space相當於倉庫,加工的半成品在這裏進行臨時
存儲基於用戶希望在某個條件下腳本中的某個命令被執行,或者希望模式空間得到保存以便下一次處理都有可能使得
sed在處理文件的時候不按照正常的流程來進行,這個時候,sed設置了一些高級命令來滿足用戶的要求。
P:打印模式空間開端至\n內容,並追加到默認輸出之前.
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行至模式空間,用下一個命令處理新的行而不是用第一個命令
N:讀取匹配到的行的下一行追加至模式空間,並在兩者之間嵌入一個新行,改變當前行號.
d: 刪除模式空間中的行
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,並不會讀取新的輸
入行,而使用合成的模式空間重新啟動循環。如果模式空間不包含換行符,則會像發出d命令那樣
啟動正常的新循環
sed-n ‘n;p‘ FILE
先讀入文件的第一行至模式空間,執行n命令(讀取下一行並覆蓋模式空間),再執行命名p(打印至屏幕)
所以最終結果是只打印了偶數行。和 sed -n 2~2p 一樣了。
sed ‘1!G;h;$!d‘ FILE
!為非的意思,1!G的意思是,第一行不執行G命令,執行h命令,把模式空間的內容覆蓋至保持空間,接下來執行d命令,
刪除模式空間的內容,$!d的意思是,最後一行不執行刪除.所以這時保持空間當中只有第一行內容。
接著第二行開始執行.讀入第二行,執行G命令後,模式空間和保持空間都有第二行的內容,接下來執行h命令,把模式空間
的內容覆蓋至保持空間.再開始執性d命令刪除模式空間內容,這時保持空間內容為第二行及第一行.
依次類推,直到執行完後,保持空間的內容相對於原文件而言,已經是倒序了.也就是 sed ‘1!G;h;$!d‘=tac(倒序)
sed ‘N;D‘ FILE
N一次讀入兩行至模式空間(a行和b行),並刪除上一行內容(a行),D如果當前模式空間內有換行符,則刪除上一行內容,
然後使用刪除後的模式空間內容(b行),接著再次讀入一行(c行).再開始刪除上一行(b行),再使用刪除後的模式空間(c行)
讀取下一行...直至讀完整個文本,輸出模式空間內容至屏幕上.這時只會打印最後一行.也就是sed ‘N;D‘ =tail -1.
sed ‘$!N;$!D‘ FILE
$!N不是最後一行就讀取兩行.$!D不是最後一行就刪除模式空間的上一行.直到最後一行時不再刪除模式空間的上一行
並將模式空間內容打印至屏幕上,相當於只打印後兩行內容.也即是sed ‘$!N;$!D‘=tail -2
sed ‘$!d‘ FILE
不是最後一行就刪除,相當於只要最後一行.也就是 sed ‘$!d‘ = sed ‘N;D‘ = tail -1.
sed ‘G’ FILE
從保持空間拉取內容追加至保持空間,而最開始保持空間內容為0.相當於在原文件每行下面添加了一個空白行.
sed ‘g’ FILE
從保持空間取出數據覆蓋至模式空間,而最開始保持空間內容為0.相當於原文件全被變成空白行了.(但總行數不變)
sed ‘/^$/d;G’ FILE
刪除空白行,再從保持空間拉取內容追加至保持空間,而最開始保持空間內容為0.相當於在原文件每行下面添加了
一個空白行.但和直接的G不同,這個命令會將所有的空白行全部刪除,只在非空白行下面追加一個空白行.
sed ‘n;d‘ FILE
讀取下一行內容至模式空間,然後執行d命令刪除,相當於隔行保留.也就是 sed ‘n;d‘ = sed -n 1~2p
sed -n ‘1!G;h;$p‘ FILE
!為非的意思,1!G的意思是,第一行不執行G命令,執行h命令,把模式空間的內容覆蓋至保持空間,接下來執行p命令,
$p的意思是,最後一行打印.這時候不打印.
接著第二行開始執行.讀入第二行,執行G命令後,模式空間和保持空間都有第二行的內容,接下來執行h命令,把模式空間
的內容覆蓋至保持空間.再開始執行$p命令,依然不打印.這時保持空間內容是第二行,第一行。依次類推,直到執行至
最後一行全部打印.相當於倒序.也就是:sed ‘1!G;h;$!d‘=tac(倒序) = sed -n ‘1!G;h;$p‘
馬哥學習-----李洋個人筆記之--sed用法