sed命令學習

2022-07-29 06:57:15 字數 3895 閱讀 1762

緒:下文僅是本人學習sed時候的一些記錄,歡迎拍磚指正

sed基本編輯命令:

#     建立批註(\為換行符)

集合有相同位址引數的指令。

!     不執行函式引數(若匹配則不執行)

注@:$!n     #不是最後一行,執行n命令

sed '/---/!s/--/replace/g'   #注意使用技巧

=     列印匹配行的行號( line number )  --最多乙個位址引數(行數在資料前一行輸出)

a\    新增使用者輸入的資料  --最多乙個位址引數(\表示換行,不可缺少)

i\    插入新增使用者輸入的資料行  --最多乙個位址引數(\表示換行,不可缺少)

注@:插入與追加命令不影響模式空間的內容,同時增加的內容對後續命令是透明的

當命令執行完時,增加的內容將被列印

注@:若增加的內容多於一行,必須用\ 遮蔽換行符,否則將會被第乙個換行符終止增加

插入命令可以用來在當前行之前加放置乙個空行

追加與更改命令可以用來在當前行之後放置乙個空行

在匹配到的每個行後面插入或者追加

c\    以使用者輸入的資料替代匹配到的內容 --最多兩個位址引數(\表示換行,不可缺少)

注@:有兩個位址引數的時候,用目標字串取代所有被定址匹配的行(目標字串只輸出一次)

當更改命令作為一組命令之一被封閉在大括號中並作用於乙個範圍內的行時,目標字串將輸出多次

該命令會清楚模式空間(與刪除命令有同樣的效果)

d     刪除資料  --最多兩個位址引數

注@:刪除模式空間中的當前行,並讀取下一行到模式空間

即使模式空間有多行,也會全部清空

改變了控制流的命令

l     列印輸出(與p及像),其中nonprinting character(非列印字元)用ascii 碼表示

注@:較長的行被折行

n     輸出當前行並讀取下乙個輸入行到模式空間(覆蓋了原來pattern space中的資料)  --最多兩個位址引數

注@:將控制轉移到n後面的命令,而不是恢復到指令碼的頂部

輸入的下一行取代模式空間的當前行

p     列印匹配行 --最多兩個位址引數

注@:可能導致輸出的重複,除非使用 -n / #n 命令列選項限制

常用於改變流控制(d、n、b)的命令之前並可能阻止當前行被輸出

q     遇到匹配行時退出,並列印匹配行(除非限制了預設輸出)  --最多乙個位址引數

注@:包括 a/r 命令追加的內容

有類似head讀取多少行的功能

r     讀取另乙個檔案中的內容並追加到模式空間內容的後面  --最多乙個位址引數(r與檔案之間必須有乙個空格)

注@:將檔案確定的行之後的內容讀入到模式空間

檔案不存在,不會報錯

讀命令的結果輸出無法被抑制

w     將模式空間的內容追加到檔案  --最多兩個位址引數(w與檔案之間必須有乙個空格)        

注@:這個動作是在遇到命令時發生,而不是在輸出模式空間內容時發生

每個指令碼最多只能開啟10個檔案

若檔案存在,則每次執行指令碼時將改變其內容(待確認是覆蓋還是追加)        

追加寫入                           

s     替換字串 --最多兩個位址引數

注@:sed '[ address [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]'

g 預設情況下只替換第一次出現模式,使用g選項替換全域性所有出現模式。

p 如果替換成功則列印該行,加p選項將使 -n 選項無效

注@:若成功進行了多個替換,將列印這個行的多個副本

n 1--512之間的乙個數字,對第幾次出現的模式進行替換(預設值為1)

w file 如果發生一次替換則將該行寫入到file檔案

注@:最多可以開啟10個不同的file

附@:sed ':a ; n ; $!ba ;s/root/feyiz/4'    #替換第4次出現的指定字元

sed '/a/$/;x}' urfile   #高效

sed '/foo/ s/foo/bar/g' filename   #高效替換

sed '/foo/ s//bar/g' filename        

y     轉換(transform)字元  --最多兩個位址引數

注@:按對應位置一一轉換字元

改變流程順序的高階命令                 

n     新增下一筆資料到pattern space  --最多兩個位址引數 

注@:在多行模式空間中,^ 只匹配空間中的第乙個字元,不匹配換行符後面的字元;$ 類似

可用於實現多行模式匹配

p     列印由 n 命令建立的多行pattern space 內的第一行資料  --最多兩個位址引數 

注@:在執行完指令碼中的最後乙個命令之後,模式空間的內容預設自動輸出

常用於n 命令之後、d命令之前,這三個命令可以建立乙個輸入/輸出迴圈,用來維護乙個兩行的模式空間,但是每次只輸出一行

若沒有將 n 用於於某一行則和 p 相同

d     刪除由n建立的多行pattern space 內的第一行資料,並且用指令碼的第一行命令重新編輯  --最多兩個位址引數

注@:d刪除後 , pattern space 內不新增下一筆資料 , 而將剩下的資料重新執行

注@:若該命令使模式空間為空,則讀取下乙個輸入行(與d命令一樣)

d 則讀入下一行後執行

d命令可以改變指令碼中控制流的命令(刪除命令會導致讀取新的輸入行,而編輯指令碼則從頭開始新的一輪)

g     拷貝資料從hold space至pattern space  --最多兩個位址引數(覆蓋原資料)

注@:若保持空間為空,則將換行符新增到模式空間

g     新增資料從hold space 至pattern space  --最多兩個位址引數(追加)

注@:若保持空間為空,則將換行符新增到模式空間

當保持空間有多行時,同時把多行資料拷貝到模式空間

h     拷貝資料從pattern space 至hold space  --最多兩個位址引數(覆蓋原資料)

注@:當模式空間有多行資料時,同時把模式空間的多行拷貝到保持空間

h     新增資料從pattern space 至hold space  --最多兩個位址引數(追加)

注@:將換行符和模式空間的內容追加到保持空間

即使保持空間為空,也追加換行符           

x     交換hold space 與pattern space 的內容

: label 定義標籤

注@:標籤的長度不超過7個字元

冒號與標籤之間不允許有空格,行尾的空格將被看做標籤的一部分

分支或者測試命令與標籤之間允許有空格,但標籤後面不能存在空格

b label 無條件跳轉到標籤label,如果label沒有指定,跳轉到命令的結尾(loop、case、while)

注@:分支命令,用於無條件轉移

可以簡單的理解為continue

t label 測試在定址的行範圍內是否成功進行了替換,如果是,則跳轉到標籤label;若沒有指定label,跳轉到命令的結尾(until)

注@:測試命令,用於有條件轉移

sed '/^aa/s/$/ yes/;t;s/$/ no/' urfile      #是aa就加yes,否則就加no

sed '/^aa/ba;s/$/ no/;b;:a;s/$/ yes/' urfile

date +%m | sed 's/$/b12a01a02a03a04a05a06a07a08a09a10a11a12/;s/^\(..\)b.*\(..\)a\1.*/\2/'  #利用lookup table取上個月的月份         

Sed命令學習

該文章 jims of 肥肥世家 table of contents 1.sed簡介 2.定址 3.sed命令 4.選項 5.元字符集 6.例項 7.指令碼 8.小技巧 可以通過定址來定位你所希望編輯的行,該位址用數字構成,用逗號分隔的兩個行數表示以這兩行為起止的行的範圍 包括行數表示的那兩行 如1...

sed命令學習

與awk命令相似sed命令也用來批量處理文字,同樣是文字處理神器 基本命令形似 sed options command file s 比如hive的hdfs資料通常以日期分割槽,在hive指令碼中如果直接用from unix表示當天日期,會無法識別分割槽導致效率極其低下 通常可以在hive指令碼中先...

sed命令學習(2)

table of contents 1.sed簡介 2.定址 3.sed命令 4.選項 5.元字符集 6.例項 7.指令碼 1.sed簡介 2.定址 可以通過定址來定位你所希望編輯的行,該位址用數字構成,用逗號分隔的兩個行數表示以這兩行為起止的行的範圍 包括行數表示的那兩行 如1,3表示1,2,3行...