日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux脚本 sed,Linux脚本利器sed

發布時間:2025/3/15 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。