1. 程式人生 > >馬哥學習-----李洋個人筆記之--sed用法

馬哥學習-----李洋個人筆記之--sed用法

sed簡介 基礎命令

Stream EDitor, 行文本編輯器
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用法