linunx sed 文字流編輯

2021-08-20 19:15:17 字數 3837 閱讀 5716

sed:檔案流編輯器,可以對匹配內容進行改動,並顯示在螢幕上,原始檔不改動,當然也可以選擇改動原始檔。

格式:

sed [選項] 'command' file(s)

sed [選項] -f scriptfile file(s)

選項:

-h或--help:顯示幫助;

-n或--quiet或——silent:僅顯示script處理後的結果,一般配合動作命令p使用。

-v或--version:顯示版本資訊。

command的命令(摘自linux 命令大全):

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末尾。

! 表示後面的命令對所有沒有被選定的行發生作用。

= 列印當前行號碼。

# 把注釋擴充套件到下乙個換行符以前。

標記:

g 表示行內全面替換。  

p 表示列印行。

w 表示把行寫入乙個檔案。

x 表示互換模板塊中的文字和緩衝區中的文字。

y 表示把乙個字元翻譯為另外的字元(但是不用於正規表示式)

\1 子串匹配標記

& 已匹配字串標記

正則字符集:

^ 匹配行開始,如:/^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/loveloveable/\1rs,loveable被替換成lovers。

& 儲存搜尋字元用來替換其他字元,如s/love/**&**/,love這成**love**。

\< 匹配單詞的開始,如:/\匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。

x\ 重複字元x,m次,如:/0\/匹配包含5個0的行。

x\ 重複字元x,至少m次,如:/0\/匹配至少有5個0的行。

x\ 重複字元x,至少m次,不多於n次,如:/0\/匹配5~10個0的行。

基本用法:

salary.txt內容,全程,簡稱,日期,工資:

lin sam,sam,2012-01-11,1000

li tom,tom,2012-01-11,2000

zhou john,john,2012-01-13,3000

lin sam,sam,2012-01-11,2000

li tom,tom,2013-01-20,3000

zhou john,john,2013-01-28,4000

替換:

把sam替換成sam(不改變原始檔)

sed 's/sam/sam/' salary.txt #替換每行第乙個sam

sed 's/sam/sam/g' salary.txt #替換每行所有的sam

上面列印所有文字,若只列印發生替換的行,用-n和p命令

sed -n 's/sam/sam/gp' salary.txt
若要改變原始檔,加-i

sed -i 's/sam/sam/g' salary.txt #把原始檔的所有sam替換成sam
只改變指定的行

sed '1,3 s/000/111/g' salary.txt #第一到第三行的000替換成111
每行從第2處匹配開始替換

sed 's/sam/sam/2g' salary.txt
將第2~4行 替換成 "new 2-4 lines"

sed '2,4c new 2-4 lines' salary.txt
刪除:

sed '2,4d' salary.txt #刪2~4行

sed '4,$d' salary.txt #刪第4到最後一行

sed '/^$/d' salary.txt #刪除空白行

sed '/^lin/d' salary.txt #刪除以lin開頭的行

sed '/sam/,/tom/d' salary.txt #刪除 包含sam行 到 包含tom行 之間的所有行

新增

sed '2a new line' salary.txt #在第2行後面新增

sed '2i new line' salary.txt #在第2行前面插入

新增多行,在第2行前面插入兩行new line 和 new line2

sed '2i new line\

> new line2' salary.txt

定界符

習慣了用/作為定界符,也可以用其他符號

sed 's:sam:sam:g' salary.txt #以:作為定界符

sed 's~sam~sam~g' salary.txt #以~作為定界符

匹配字串

匹配到的字串用 & 代替,&代表的所有匹配到的字串,\子字串匹配

\(..\) 用於匹配子串,\n表示第n個匹配到子字串,\1表示第乙個匹配到的

sed 's/\(\w*\) \(\w*\)/\2 \1/' salary.txt #把第乙個匹配到的\w*\ 跟第乙個交換了一下位置
指令碼

把上面的命令寫入sedscript:

s/\(\w*\) \(\w*\)/\2 \1/
執行:

sed -f sedscript salary.txt
得到同樣的效果

Sed 流文字編輯器

一 sed流文字編輯器介紹 sed stream editor 本質上是乙個編輯器,但是它是非互動式的,這點與vim不同 同時它又是面向字元流的,輸入的字元流經過sed的處理後輸出。這兩個特性使得sed成為命令列下面非常有用的乙個處理工具,同時sed能夠完美的配合正規表示式使用。這裡先談一下互動式和...

編輯文字(EditText)

先看一下它的基本屬性 2.xml檔案 android layout width match parent android layout height match parent android orientation vertical android padding 5dp android layou...

sed 流編輯命令

sed 1,2d hosts 刪除第一行第二行 原檔案不變 sed i 1,2d hosts sed d hosts 刪除最後一行 sed s local local g hosts local 替換成 local sed 1 i000000 hosts key i上一行新增str sed 1 a0...