linux脚本 sed,Linux脚本利器sed
sed
文本例子使用以下文件
$pg quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
1 sed怎樣讀取數據
sed從文件的一個文本行或從標準輸入的幾種格式中讀取數據,將之拷貝到一個編輯緩沖區,然后讀命令行或腳本的第一條
命令,并使用這些命令查找模式或定位行號編輯它。重復此過程直到命令結束。
2 調用sed
調用sed有三種方式:
在命令行鍵入命令;
將sed命令插入腳本文件,然后調用sed;
將sed命令插入腳本文件,并使sed腳本可執行。
使用sed命令行格式為:
sed [選項] sed命令 ?輸入文件
記住在命令行使用sed命令時,實際命令要加單引號。sed也允許加雙引號。
使用sed腳本文件,格式為:
sed [選項] -f sed腳本文件 ? 輸入文件
要使用第一行具有sed命令解釋器的sed腳本文件,其格式為:
sed腳本文件 ?[選項] ?輸入文件
不管是使用shell命令行方式或腳本文件方式,如果沒有指定輸入文件,sed從標準輸入中接受輸入,一般是鍵盤或重定向結果。
sed選項如下:
n 不打印;sed不寫編輯行到標準輸出,缺省為打印所有行(編輯和未編輯)。p命令可以用來打印編輯行。
c 下一命令是編輯命令。使用多項編輯時加入此選項。如果只用到一條sed命令,此選項無用,但指定它也沒有關系。
f 如果正在調用sed腳本文件,使用此選項。此選項通知sed一個腳本文件支持所有的sed命令,
例如:sed -f myscript.sed input_file,這里myscript.sed即為支持sed命令的文件
2.1 使用sed在文件中查詢文本的方式
sed瀏覽輸入文件時,缺省從第一行開始,有兩種方式定位文本:
1) 使用行號,可以是一個簡單數字,或是一個行號范圍。
2) 使用正則表達式。
使用sed在文件中定位文本的方式
x ? ? ? ? ? ? ? ? ? ?x為一行號,如1
x,y ? ? ? ? ? ? ? ? ?表示行號范圍從x到y,如2,5表示從第2行到第5行
/pattern/ ? ? ? ? ? ?查詢包含模式的行。例如/disk/或/[a-z]/
/pattern/pattern/ ? ?查詢包含兩個模式的行。例如/disk/disks/
pattern/,x ? ? ? ? ? 在給定行號上查詢包含模式的行。如/ribbon/,3
x,/pattern/ ? ? ? ? ?通過行號和模式查詢匹配行。 3,/vdu/
x,y! ? ? ? ? ? ? ? ? 查詢不包含指定行號x和y的行。1,2!
2.2 基本sed編輯命令
sed編輯命令
p ? ? ? ? 打印匹配行
= ? ? ? ? 顯示文件行號
a\ ? ? ? ?在定位行號后附加新文本信息
i\ ? ? ? ?在定位行號后插入新文本信息
d ? ? ? ? 刪除定位行
c\ ? ? ? ?用新文本替換定位文本
s ? ? ? ? 使用替換模式替換相應模式
& ? ? ? ? 與s配合使用,在行中插入文本
r ? ? ? ? 從另一個文件中讀文本
w ? ? ? ? 寫文本到一個文件
q ? ? ? ? 第一個模式匹配完成后推出或立即推出
l ? ? ? ? 顯示與八進制ASCII代碼等價的控制字符
{} ? ? ? ?在定位行執行的命令組
n ? ? ? ? 從另一個文件中讀文本下一行,并附加在下一行
g ? ? ? ? 將模式2粘貼到/pattern n/
y ? ? ? ? 傳送字符
n ? ? ? ? 延續到下一輸入行;允許跨行的模式匹配語句
2.3 打印文本 example
$sed -n '2p' quote.txt ? ? ? ? ? ? ? ? ? ? ? ? ? (打印第二行)
$sed -n '$p' quote.txt ? ? ? ? ? ? ? ? ? ? ? ? ? (打印最后一行)
$sed -n '1,3p' quote.txt ? ? ? ? ? ? ? ? ? ? ? ? (打印第1~3行)
$sed -n '/Neave/'p quote.txt ? ? ? ? ? ? ? ? ? ? (打印匹配Neave的行)
$sed -n '4,/The/'p quote.txt ? ? ? ? ? ? ? ? ? ? (在第四行匹配模式The,若匹配,則打印)
$sed -n '/\$/'p quote.txt (匹配元字符$)
$sed -n '1,$'p quote.txt ? ? ? ? ? ? ? ? ? ? ? ? (打印整個文件,只需將行范圍設為第一行到最后一行1,$. $意為最后一行)
$sed -n '/.*ing/'p quote.txt ? ? ? ? ? ? ? ? ? ? (任意字符:使用模式/.*ing/查詢以ing結尾的任意單詞)
$sed -n '/music/=' quote.txt ? ? ? ? ? ? ? ? ? ? (打印匹配行的行號)
$sed -n -e '/music/p' -e '/music/=' quote.txt ? ?(打印匹配行的內容和行號)
$sed '=' quote.txt | tail -2 ? ? ? ? ? ? ? ? ? ? (顯示行數或最大行號)
2.4 創建sed腳本文件 || sed用法
2.4.1附加文本 a\
$chmod u+x append.sed
$pg append.sed
#!/bin/sed -f
/company/ a\
Then suddenly it happened.
運行腳本:$append.sed quote.txt
第二行以/company/開始,這是附加操作起始位置. a\通知sed這是一個附加操作,首先應插入一個新行。第三行是附加操作
要加入到拷貝的實際文本。輸出顯示附加結果。
2.4.2插入文本 i\
插入命令類似于附加命令,只是在指定行前面插入。和附加命令一樣,它也只接受一個地址。
下面腳本使用行號指定文本插入位置,插入位置在模式或指定行號4之前。腳本如下:
#!/bin/sed -f
4 i\
Utter insert ok.
2.4.3修改文本 c\
修改命令將在匹配模式空間的指定行用新文本加以替代
將第一行The honeysuckle band played all night long for only $90替換為The office Dibble band played well。首先要
匹配第一行的任何部分,可使用模式'/Honeysuckle/'。sed腳本文件為change.sed。內容如下:
$pg change.sed
#!/bin/sed -f
/Honeysuckle/ c\
The office Dibble band played well.
像插入動作一樣,可以使用行號代替模式,兩種方式A完成相同的功能。
#!/bin/sed -f
3 c\
The office Dibble band played well.
2.4.4刪除文本 d
sed刪除文本格式:[address[,address]]d
地址可以是行的范圍或模式,example as:
$sed '1d' quote.txt ? ? ? ? ? ? ?刪除第一行
$sed '1,3'd quote.txt ? ? ? ? ? ?刪除第一到第三行
$sed '$d' quote.txt ? ? ? ? ? ? ?刪除最后一行
$sed '/Neave/d' quote.txt ? ? ? ?刪除包含文本'Neave'的行
$sed '-e/Neave/d' quote.txt ? ? ?刪除包含文本'Neave'的行
2.4.5替換文本 s
替換命令用替換模式替換指定模式,格式為:[address[,address]] s/pattern-to-find/replacement-pattern/[g p w n]
s選項 通知sed這是一個替換操作,并查詢pattern-to-find,成功后用replacement-pattern替換它。
替換選項如下:
g ? ? 缺省情況下只替換第一次出現模式,使用g選項替換全局所有出現模式。
p ? ? 缺省sed將所有被替換行寫入標準輸出,加p選項將使-n選項無效。
-n ? ? 選項不打印輸出結果。
w ? ? 文件名使用此選項將輸出定向到一個文件。
example:
$sed 's/night/NIGHT/' quote.txt ? ? ? ? ? ? ? ? ?(替換night為NIGHT(第一個) ?)
$sed 's/\$//' quote.txt ? ? ? ? ? (替換$符號為空白--即刪除$符號)
$sed 's/The/hehe/g' quote.txt ? ? ? ? ? ? ? ? ? ?(替換所有的The為hehe)
$sed 's/night/lghti/w sed.out' quote.txt ? ? ? ? (替換結果寫入文件sed.out)
2.4.6 使用替換文本模式插入 (&)
如果要附加或修改一個字符串,可以使用(&)命令,&命令保存發現模式以便重新調用它,然后把它放在替換字符串里面。
即先給出一個被替換模式,然后是一個準備附加在第一個模式后的另一個模式,并且后面帶有&,這樣修改模式將放在匹配模
式之前。例如,sed語句s/nurse/"Hello" &/p 的結果如下:
$sed -n 's/nurse/"Hello" &/p' quote.txt
此句在nurse 之前加上"Hello "
$sed 's/[0-9][0-9]*/& Passwd/g' ok.txt
此句在文本ok.txt中,在所有的單個或連續數字后面加上'Passwd'.
$sed 's/[0-9][0-9][0-9]*/& Passwd/g' ok.txt
此句在文本ok.txt中,在所有的2個或2個以上連續數字后面加上'Passwd'.
2.4.7 從文件中讀文本 r
$sed '/company/r sedin.txt' quote.txt (在quote.txt的匹配行后插入文本sedin.txt的內容)
2.4.8 首次匹配后退出 q
$sed ?'/.a.*/q' quote.txt ? ? ? ? ? ? ? ? ? ? ? ?(匹配"任意字符后跟字符a,再跟任意字符0次或任意多次",首次匹配后退出)
2.5 使用系統sed
sed的基本功能,但是在腳本或命令行中使用sed真正要做的是修改或刪除文件或字符串中文本。
2.5.1 處理控制字符
使用sed實現的一個重要功能是在另一個系統中下載的文件中剔除控制字符。
下面是傳送過來的文件(dos.txt)的部分腳本, 必須去除所有可疑字符,以便于帳號所有者使用文件。
$pg dos.txt
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##34.46^M
進行如下操作:
1) 用一個空格替換所有的(##)符號。
2) 除起始域中最前面的0(00)。
3) ?刪除行尾控制字符(^M)。
4) ?刪除行首數字
一些系統中,回車符為^@和^L,如果遇到一些怪異的字符,不必擔心,只要是在行尾并且全都相同就可以。
按步執行每一項任務,以保證在進行到下一任務前得到理想結果。使用輸入文件dos.txt。
任務1 ? ?刪除所有的#字符很容易,可以使用全局替換命令。這里用一個空格替換兩個或更多的#符號。
$sed 's/##*/ /g' dos.txt ? ? ? ? ? ? ? ?(s -- 替換 ; g -- 所有 )
12332 DISO 45.12^M
00332 LPSO 23.11^M
01299 USPD 34.46^M
任務2 刪除所有行首的0。 ^0*表示行首任意個0。模式s/^0*//g設置替換部分為空,即為刪除模式,正是要求所在。
$sed 's/^0*//g' dos.txt
12332##DISO##45.12^M
332##LPSO##23.11^M
1299##USPD##34.46^M
任務3 ? ?最后去除行尾^M符號,為此需做全局替換。設置替換部分為空。模式為:'s/^m/ /g',注意'^M',這是一個控制字符。
要產生控制字符(^M),需遵從前面產生F1鍵同樣的處理過程。步驟如下;鍵入sed s/,然后按住鍵和v鍵,釋放v鍵,
再按住^鍵,并保持鍵不動,再釋放兩個鍵,最后按鍵。下面命令去除行尾^M字符。
$sed 's/^M//g' dos.txt
以上三步,也可使用一條命令實現:
$cat dos.txt | sed 's/##*/ /g' |sed 's/^0*//g' |sed 's/^M//g'
放在腳本里實現如下:
$pg dos.sed
#!/bin/sed -f
### to call : dos.sed dos.txt
s/##*/ /g
s/^0*//g
s/\^M//g
#### END
任務4 ? ?刪除行首數字
$sed 's/^[0-9]*//g' dos.txt
2.5.2 處理報文輸出
當從數據庫中執行語句輸出時,一旦有了輸出結果,腳本即可做進一步處理。通常先做一些整理,下面是一個sql查詢結果。
Database ? ? size ? ?date created
------------------------------
gosouth ? ? ? 2244 ? ?12/11/97
trisud ? ? ? ?5632 ? ?8/9/99
(2 rows affected)
為了使用上述輸出信息做進一步自動處理,需要知道所存數據庫名稱,為此需執行以下操作:
1) 使用s/-*//g刪除橫線------。
2) 使用/^$/d刪除空行。 ? ? ? ? ? ? ? ? ?(注意空行表示為^$)
3) 使用$d刪除最后一行
4) 使用1d刪除第一行。
5) 使用awk {print $1}打印第一列。
命令如下,這里使用了cat,并管道傳送結果到sed命令。
$ cat sql.txt | sed 's/-*//g' | sed '/^$/d' | sed '$d' | sed '1d' | awk '{print $1}'
gosouth
trisud
2.5.3 從shell向sed傳值
要從命令行中向sed傳值,值得注意的是用雙引號,否則功能不執行。
$NAME="It's a go situation"
$REPLACE="GO"
$echo $NAME | sed "s/go/$REPLACE/g"
It's a GO situation
2.5.4 從sed輸出中設置shell變量
從sed輸出中設置shell變量是一個簡單的替換過程。運用上面的例子,創建shell變量NEW_NAME,保存上述sed例子的輸出結果。
$NAME="It's a go situation"
$REPLACE="GO"
$NEW_NAME= 'echo $NAME | sed "s/go/$REPLACE/g"'
$echo $NEW_NAME
It's a GO situation
2.6 ?快速命令
下面是一些一行命令集。([h]表示空格,[ ]表示tab鍵)
's/.$//g' 刪除結尾最后一個字符
's/\.$//g' 刪除結尾句點
'/\.$/d' ? ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除以句點結尾行
'/.$/d' ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除所有行
'/^./d' ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除所有行
'-e/abcd/d' 刪除包含abcd的行
's/[][][]*/[]/g' ? ? ? ? ? ? ? ? ? ? 刪除一個以上空格,用一個空格代替
's/^[][]*//g' ? ? ? ? ? ? ? ? ? ? ? ?刪除行首空格
's/\.[][]*/[]/g' ? ? ? ? ? ? ? ? ? ? 刪除句點后跟兩個或更多空格,代之以一個空格
'/^$/d' ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?刪除空行 ?(僅有空格的行不能刪除)
'/^[[:space:]]*$/d' ? ? ? ? ? ? ? ? ?刪除空行 ?(包括僅有空格的行)
's/^.//g' ? ? ? ? ? ? ? ? ? ? ? ? ? ?刪除第一個字符
's/COL\(...\)//g' ? ? ? ? ? ? ? ? ? ?刪除COL及緊跟COL的后三個字母
's/COL...//g' ? ? ? ? ? ? ? ? ?刪除COL及緊跟COL的后三個字母
's/^\///g' ? ? ? ? ? ? ? ? ? ? ? ? ? 從路徑中刪除第一個\
's/[]/[ ]/g' ? ? ? ? ? ? ? ? ? ? ? ? 刪除所有空格并用tab鍵替代
's/^[ ]//g' ? ? ? ? ? ? ? ? ? ? ? ? ?刪除行首所有tab鍵
's/[ ]*//g' ? ? ? ? ? ? ? ? ? ? ? ? ?刪除所有tab鍵
example:
1. 刪除路徑名第一個\符號
將當前工作目錄返回給sed,刪除第一個\:
$pwd | sed 's/^\///g'
2. 追加/插入文本
將"Mr Willis"字串返回給sed并在Mr后而追加"Bruce"。
$echo "Mr Willis" | sed 's/Mr/& Bruce/g'
3. 刪除首字符
sed刪除字符串"accounts.doc"首字符。
$echo "accounts.doc" | sed 's/^.//g'
4. 刪除文件擴展名
sed刪除"accounts.doc"文件擴展名。
$echo "accounts.doc" | sed 's/\....//g'
5. 增加文件擴展名
sed附加字符串".doc"到字符串"accounts"。
$echo "accounts" | sed 's/$/.doc/g'
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的linux脚本 sed,Linux脚本利器sed的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java.lang.math.abs_j
- 下一篇: CPU指令集是什么东西