您好,登錄后才能下訂單哦!
這篇文章主要介紹了shell腳本中sed怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
sed在處理文本時是逐行讀取文件內容,讀到匹配的行就根據指令做操作,不匹配就跳過。
sed是Linux下一款功能強大的非交互流式文本編輯器,可以對文本文件進行增、刪、改、查等操作,支持按行、按字段、按正則匹配文本內容,靈活方便,特別適合于大文件的編輯。本文主要介紹sed的一些基本用法,并通過shell腳本演示sed的使用實例。
一.在命令行指定sed指令對文本進行處理:sed +選項 ‘指令' 文件
二.先將sed指令保存到文件中,將該文件作為參數進行調用:sed +選項 -f 包含sed指令的文件 文件
-r:使用擴展正則表達式
-e:它告訴sed將下一個參數解釋為一個sed指令,只有當命令行上給出多個sed指令時才需要使用-e選項
-f:后跟保存了sed指令的文件
-i:直接對內容進行修改,不加-i時默認只是預覽,不會對文件做實際修改
-n:取消默認輸出,sed默認會輸出所有文本內容,使用-n參數后只顯示處理過的行
a:追加 向匹配行后面插入內容
c:更改 更改匹配行的內容
i:插入 向匹配行前插入內容
d:刪除 刪除匹配的內容
s:替換 替換掉匹配的內容
p:打印 打印出匹配的內容,通常與-n選項和用
=:用來打印被匹配的行的行號
n:讀取下一行,遇到n時會自動跳入下一行
r,w:讀和寫編輯命令,r用于將內容讀入文件,w用于將匹配內容寫入到文件
sed '3ahello' 1.txt #向第三行后面添加hello,3表示行號
sed '/123/ahello' 1.txt #向內容123后面添加hello,如果文件中有多行包括123,則每一行后面都會添加
sed '$ahello' 1.txt #在最后一行添加hello
sed '3ihello' 1.txt #在第三行之前插入hello
sed '/123/ihello' 1.txt #在包含123的行之前插入hello,如果有多行包含123,則包含123的每一行之前都會插入hello
sed '$ihello' 1.txt #在最后一行之前插入hello
sed '1chello' 1.txt #將文件1.txt的第一行替換為hello
sed '/123/chello' 1.txt #將包含123的行替換為hello
sed '$chello' 1.txt #將最后一行替換為hello
sed '4d' 1.txt #刪除第四行
sed '1~2d' 1.txt #從第一行開始刪除,每隔2行就刪掉一行,即刪除奇數行
sed '1,2d' 1.txt #刪除1~2行
sed '1,2!d' 1.txt #刪除1~2之外的所有行
sed '$d' 1.txt #刪除最后一行
sed '/123/d' 1.txt #刪除匹配123的行
sed '/123/,$d' 1.txt #刪除從匹配123的行到最后一行
sed '/123/,+1d' 1.txt #刪除匹配123的行及其后面一行
sed '/^$/d' 1.txt #刪除空行
sed '/123\|abc/!d' 1.txt #刪除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反
sed '1,3{/123/d}' 1.txt #刪除1~3行中,匹配內容123的行,1,3表示匹配1~3行,{/123/d}表示刪除匹配123的行
sed 's/123/hello/' 1.txt #將文件中的123替換為hello,默認只替換每行第一個123
sed 's/123/hello/g' 1.txt #將文本中所有的123都替換為hello
sed 's/123/hello/2' 1.txt #將每行中第二個匹配的123替換為hello
sed -n 's/123/hello/gpw 2.txt' 1.txt #將每行中所有匹配的123替換為hello,并將替換后的內容寫入2.txt
sed '/#/s/,.*//g' 1.txt #匹配有#號的行,替換匹配行中逗號后的所有內容為空 (,.*)表示逗號后的所又內容
sed 's/..$//g' 1.txt #替換每行中的最后兩個字符為空,每個點代表一個字符,$表示匹配末尾 (..$)表示匹配最后兩個字符
sed 's/^#.*//' 1.txt #將1.txt文件中以#開頭的行替換為空行,即注釋的行 ( ^#)表示匹配以#開頭,(.*)代表所有內容
sed 's/^#.*//;/^$/d' 1.txt #先替換1.txt文件中所有注釋的空行為空行,然后刪除空行,替換和刪除操作中間用分號隔開
sed 's/^[0-9]/(&)/' 1.txt #將每一行中行首的數字加上一個小括號 (^[0-9])表示行首是數字,&符號代表匹配的內容 #或者 sed 's/\(^[0-9]\)/(\1)/' 1.txt #替換左側特殊字符需鑰轉義,右側不需要轉義,\1代表匹配的內容
sed 's/$/&'haha'/' 1.txt # 在1.txt文件的每一行后面加上"haha"字段
sed -n '3p' 1.txt #打印文件中的第三行內容
sed -n '2~2p' 1.txt #從第二行開始,每隔兩行打印一行,波浪號后面的2表示步長
sed -n '$p' 1.txt #打印文件的最后一行
sed -n '1,3p' 1.txt #打印1到3行
sed -n '3,$p' 1.txt #打印從第3行到最后一行的內容
sed -n '/you/p' 1.txt #逐行讀取文件,打印匹配you的行
sed -n '/bob/,3p' 1.txt #逐行讀取文件,打印從匹配bob的行到第3行的內容 sed -n '/you/,3p' 1.txt #打印匹配you 的行到第3行,也打印后面所有匹配you 的行
sed -n '1,/too/p' 1.txt #打印第一行到匹配too的行 sed -n '3,/you/p' 1.txt #只打印第三行到匹配you的行
sed -n '/too/,$p' 1.txt #打印從匹配too的行到最后一行的內容
sed -n '/too/,+1p' 1.txt #打印匹配too的行及其向后一行,如果有多行匹配too,則匹配的每一行都會向后多打印一行
sed -n '/bob/,/too/p' 1.txt #打印從匹配內容bob到匹配內容too的行
sed -n "$=" 1.txt #打印1.txt文件最后一行的行號(即文件有多少行,和wc -l 功能類似)
sed -n '/error/=' 1.txt #打印匹配error的行的行號 sed -n '/error/{=;p}' 1.txt #打印匹配error的行的行號和內容(可用于查看日志中有error的行及其內容)
sed 'r 2.txt' 1.txt #將文件2.txt中的內容,讀入1.txt中,會在1.txt中的每一行后都讀入2.txt的內容
sed '3r 2.txt' 1.txt #在1.txt的第3行之后插入文件2.txt的內容(可用于向文件中插入內容)
sed '/245/r 2.txt' 1.txt #在匹配245的行之后插入文件2.txt的內容,如果1.txt中有多行匹配456則在每一行之后都會插入
sed '$r 2.txt' 1.txt #在1.txt的最后一行插入2.txt的內容
sed -n 'w 2.txt' 1.txt #將1.txt文件的內容寫入2.txt文件,如果2.txt文件不存在則創建,如果2.txt存在則覆蓋之前的內容
sed -n '2w 2.txt' 1.txt #將文件1.txt中的第2行內容寫入到文件2.txt
sed -n -e '1w 2.txt' -e '$w 2.txt' 1.txt #將1.txt的第1行和最后一行內容寫入2.txt sed -n -e '1w 2.txt' -e '$w 3.txt' 1.txt #將1.txt的第1行和最后一行分別寫入2.txt和3.txt
sed -n '/abc\|123/w 2.txt' 1.txt #將1.txt中匹配abc或123的行的內容,寫入到2.txt中
sed -n '/666/,$w 2.txt' 1.txt #將1.txt中從匹配666的行到最后一行的內容,寫入到2.txt中
sed -n '/xyz/,+2w 2.txt' 1.txt #將1.txt中從匹配xyz的行及其后2行的內容,寫入到2.txt中
實例1:替換文件中的內容
#!/bin/bash if [ $# -ne 3 ];then #判斷參數個數 echo "Usage: $0 old-part new-part filename" #輸出腳本用法 exit fi sed -i "s#$1#$2#" $3 #將 舊內容進行替換,當$1和$2中包含"/"時,替換指令中的定界符需要更換為其他符號
實例2:刪除文件中的空白行
#!/bin/bash if [ ! -f $1 ];then #判斷參數是否為文件且存在 echo "$0 is not a file" exit fi sed -i "/^$/d" $1 #將空白行刪除
實例3:格式化文本內容
#!/bin/bash a='s/^ *>// #定義一個變量a保存sed指令,'s/^ *>//':表示匹配以0個或多空格開頭緊跟一個'>'號的行,將匹配內容替換 s/\t*// #'s/\t*//':表示匹配以0個或多個制表符開頭的行,將匹配內容替換 s/^>// #'s/^>//' :表示匹配以'>'開頭的行,將匹配內容替換 s/^ *//' #'s/^ *//':表示匹配以0個或多個空格開頭的行,將匹配內容替換 #echo $a sed "$a" $1 #對用戶給定的文本文件進行格式化處理
實用腳本:批量更改當前目錄中的文件后綴名:
示例1:
#!/bin/bash if [ $# -ne 2 ];then #判斷用戶的輸入,如果參數個數不為2則打印腳本用法 echo "Usage:$0 + old-file new-file" exit fi for i in *$1* #對包含用戶給定參數的文件進行遍歷 do if [ -f $i ];then iname=`basename $i` #獲取文件名 newname=`echo $iname | sed -e "s/$1/$2/g"` #對文件名進行替換并賦值給新的變量 mv $iname $newname #對文件進行重命名 fi done exit 666
示例2:
#!/bin/bash read -p "input the old file:" old #提示用戶輸入要替換的文件后綴 read -p "input the new file:" new [ -z $old ] || [ -z $new ] && echo "error" && exit #判斷用戶是否有輸入,如果沒有輸入怎打印error并退出 for file in `ls *.$old` do if [ -f $file ];then newfile=${file%$old} #對文件進行去尾 mv $file ${newfile}$new #文件重命名 fi done
示例3:
#!/bin/bash if [ $# -ne 2 ];then #判斷位置變量的個數是是否為2 echo "Usage:$0 old-file new-file" exit fi for file in `ls` #在當前目錄中遍歷文件 do if [[ $file =~ $1$ ]];then #對用戶給出的位置變量$1進行正則匹配,$1$表示匹配以變量$1的值為結尾的文件 echo $file #將匹配項輸出到屏幕進行確認 new=${file%$1} #對文件進行去尾處理,去掉文件后綴保留文件名,并將文件名賦給變量new mv $file ${new}$2 #將匹配文件重命名為:文件名+新的后綴名 fi done
示例4:使用sed匹配文件中的IP地址
sed -nr '/([0-9]{1,3}\.){3}([0-9]{1,3})/p' 1.txt
感謝你能夠認真閱讀完這篇文章,希望小編分享的“shell腳本中sed怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。