sed

sed是一種流編輯器,它是文本處理中很是中的工具,可以完美的配合正則表達式使用,功能與衆不同。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。linux

sed的語法

sed [options] 'command' file(s) sed [options] -f scriptfile file(s)

選項

-e<script>或--expression=<script>:以選項中的指定的script來處理輸入的文本文件;
-f<script文件>或--file=<script文件>:以選項中指定的script文件來處理輸入的文本文件;
-h或--help:顯示幫助;
-n或--quiet或——silent:僅顯示script處理後的結果;
-V或--version:顯示版本信息。

sed命令

a\ 在當前行下面插入文本。
i\ 在當前行上面插入文本。
c\ 把選定的行改成新的文本。
d 刪除,刪除選擇的行。
D 刪除模板塊的第一行。
s 替換指定字符
h 拷貝模板塊的內容到內存中的緩衝區。
H 追加模板塊的內容到內存中的緩衝區。
g 得到內存緩衝區的內容,並替代當前模板塊中的文本。
G 得到內存緩衝區的內容,並追加到當前模板塊文本的後面。
l 列表不能打印字符的清單。
n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N 追加下一個輸入行到模板塊後面並在兩者間嵌入一個新行,改變當前行號碼。
p 打印模板塊的行。
P(大寫) 打印模板塊的第一行。
q 退出Sed。
b lable 分支到腳本中帶有標記的地方,若是分支不存在則分支到腳本的末尾。
r file 從file中讀行。
t label if分支,從最後一行開始,條件一旦知足或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。
T label 錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。
w file 寫並追加模板塊到file末尾。  
W file 寫並追加模板塊的第一行到file末尾。  
! 表示後面的命令對全部沒有被選定的行發生做用。  
= 打印當前行號碼。  
# 把註釋擴展到下一個換行符之前。  

sed替換標記

g 表示行內全面替換。  
p 表示打印行。  
w 表示把行寫入一個文件。  
x 表示互換模板塊中的文本和緩衝區中的文本。  
y 表示把一個字符翻譯爲另外的字符(可是不用於正則表達式)
\1 子串匹配標記
& 已匹配字符串標記

sed元字符集

^ 匹配行開始,如:/^sed/匹配全部以sed開頭的行。
$ 匹配行結束,如:/sed$/匹配全部以sed結尾的行。
. 匹配一個非換行符的任意字符,如:/s.d/匹配s後接一個任意字符,最後是d。
* 匹配0個或多個字符,如:/*sed/匹配全部模板是一個或多個空格後緊跟sed的行。
[] 匹配一個指定範圍內的字符,如/[ss]ed/匹配sed和Sed。 [^] 匹配一個不在指定範圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。 & 保存搜索字符用來替換其餘字符,如s/love/**&**/,love這成**love**。 \< 匹配單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。 \> 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。 x\{m\} 重複字符x,m次,如:/0\{5\}/匹配包含5個0的行。 x\{m,\} 重複字符x,至少m次,如:/0\{5,\}/匹配至少有5個0的行。 x\{m,n\} 重複字符x,至少m次,很少於n次,如:/0\{5,10\}/匹配5~10個0的行。

例子

 

替換操做:s命令正則表達式

sed 's/date/code/' test.txt 

注意s務必要和字符之間有斜槓,替換字符和被替換字符後也要有斜槓express

-n選項p命令一塊兒使用表示只打印那些發生替換的行:app

sed -n 's/date/code/' test.txt 編輯器

直接編輯文件選項-i,會匹配file文件中每一行的第一個date替換爲code:工具

輸出後的內容ui

import codetime
def get_nday_list(n):
    import codetime
    before_n_days = []
    for i in range(1, n + 1)[::-1]:
        before_n_days.append(str(codetime.date.today() - datetime.timedelta(days=i)))
    return before_n_days

a = get_nday_list(7)
print(a)
獲取今天的前n天的日期列表
獲取指定時間的前n天的日期
import codetime
def get_day_nday_ago(code,n):
    t = time.strptime(code, "%Y-%m-%d")
    y, m, d = t[0:3]
    Date = str(codetime.datetime(y, m, d) - datetime.timedelta(n)).split()
    return Date[0]

 


全面替換標記gspa

使用後綴 /g 標記會替換每一行中的全部匹配:.net

 sed 's/date/code/g' test.txt 

當須要從第N處匹配開始替換時,可使用 /Ng:翻譯

 


定界符
刪除操做:d命令
已匹配字符串標記&
子串匹配標記\1
組合多個表達式
引用
選定行的範圍:,(逗號)
多點編輯:e命令
從文件讀入:r命令
寫入文件:w命令
追加(行下):a\命令

test文件內容以下:

import datetime
def get_nday_list(n):
    import datetime
    before_n_days = []
homework
    for i in range(1, n + 1)[::-1]:
        before_n_days.append(str(datetime.date.today() - datetime.timedelta(days=i)))
    return before_n_days

a = get_nday_list(7)
print(a)
獲取今天的前n天的日期列表
獲取指定時間的前n天的日期
import datetime
def get_day_nday_ago(date,n):
    t = time.strptime(date, "%Y-%m-%d")
    y, m, d = t[0:3]
    Date = str(datetime.datetime(y, m, d) - datetime.timedelta(n)).split()
    return Date[0]

在文件的第五行後面加入helloworld

sed -e 5a\helloworld test.txt

輸出後的

import datetime
def get_nday_list(n):
    import datetime
    before_n_days = []
    for i in range(1, n + 1)[::-1]:
helloworld
        before_n_days.append(str(datetime.date.today() - datetime.timedelta(days=i)))
    return before_n_days

a = get_nday_list(7)
print(a)
獲取今天的前n天的日期列表
獲取指定時間的前n天的日期
import datetime
def get_day_nday_ago(date,n):
    t = time.strptime(date, "%Y-%m-%d")
    y, m, d = t[0:3]
    Date = str(datetime.datetime(y, m, d) - datetime.timedelta(n)).split()
    return Date[0]

 


插入(行上):i\命令

在文件的第6行上面加入homework

sed -e 6i\helloworld test.txt

輸出後的內容

import datetime
def get_nday_list(n):
    import datetime
    before_n_days = []
homework
    for i in range(1, n + 1)[::-1]:
        before_n_days.append(str(datetime.date.today() - datetime.timedelta(days=i)))
    return before_n_days

a = get_nday_list(7)
print(a)
獲取今天的前n天的日期列表
獲取指定時間的前n天的日期
import datetime
def get_day_nday_ago(date,n):
    t = time.strptime(date, "%Y-%m-%d")
    y, m, d = t[0:3]
    Date = str(datetime.datetime(y, m, d) - datetime.timedelta(n)).split()
    return Date[0]

 替換(c)

sed -e 5c\china test.txt

輸出後的內容

import datetime
def get_nday_list(n):
    import datetime
    before_n_days = []
china
        before_n_days.append(str(datetime.date.today() - datetime.timedelta(days=i)))
    return before_n_days

a = get_nday_list(7)
print(a)
獲取今天的前n天的日期列表
獲取指定時間的前n天的日期
import datetime
def get_day_nday_ago(date,n):
    t = time.strptime(date, "%Y-%m-%d")
    y, m, d = t[0:3]
    Date = str(datetime.datetime(y, m, d) - datetime.timedelta(n)).split()
    return Date[0]

刪除(d)

 sed -e 5d test.txt 

輸出後的內容

import datetime
def get_nday_list(n):
    import datetime
    before_n_days = []
        before_n_days.append(str(datetime.date.today() - datetime.timedelta(days=i)))
    return before_n_days

a = get_nday_list(7)
print(a)
獲取今天的前n天的日期列表
獲取指定時間的前n天的日期
import datetime
def get_day_nday_ago(date,n):
    t = time.strptime(date, "%Y-%m-%d")
    y, m, d = t[0:3]
    Date = str(datetime.datetime(y, m, d) - datetime.timedelta(n)).split()
    return Date[0]
刪除空白行
sed '/^$/d'  test.txt

 

下一個:n命令變形:y命令退出:q命令保持和獲取:h命令和G命令保持和互換:h命令和x命令腳本scriptfile打印奇數行或偶數行打印匹配字符串的下一行

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息