shell腳本--sed的用法


sed在處理文本時是逐行讀取文件內容,讀到匹配的行就根據指令做操作,不匹配就跳過。

sed是Linux下一款功能強大的非交互流式文本編輯器,可以對文本文件進行增、刪、改、查等操作,支持按行、按字段、按正則匹配文本內容,靈活方便,特別適合於大文件的編輯。本文主要介紹sed的一些基本用法,並通過shell腳本演示sed的使用實例。

1.sed的使用方法,調用sed 命令的語法有兩種:

一.在命令行指定sed指令對文本進行處理:sed +選項  ‘指令’ 文件

二.先將sed指令保存到文件中,將該文件作為參數進行調用:sed   +選項  -f  包含sed指令的文件  文件

sed的常用選項:

-e:它告訴sed將下一個參數解釋為一個sed指令,只有當命令行上給出多個sed指令時才需要使用-e選項

-f:后跟保存了sed指令的文件

-i:直接對內容進行修改,不加-i時默認只是預覽,不會對文件做實際修改

-n:取消默認輸出,sed默認會輸出所有文本內容,使用-n參數后只顯示處理過的行

sed中的編輯命令:

a:追加  向匹配行后面插入內容

c:更改  更改匹配行的內容

i:插入  向匹配行前插入內容

d:刪除  刪除匹配的內容

s:替換  替換掉匹配的內容

p:打印  打印出匹配的內容,通常與-n選項和用

=:用來打印被匹配的行的行號

n:讀取下一行,遇到n時會自動跳入下一行

r,w:讀和寫編輯命令,r用於將內容讀入文件,w用於將匹配內容寫入到文件

2.sed命令實例:

示例1:向文件中添加或插入行

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

示例2:更改文件中指定的行

sed  '1chello'  1.txt  #將文件1.txt的第一行替換為hello

sed  '/123/chello'  1.txt  #將包含123的行替換為hello

sed '$chello'  1.txt  #將最后一行替換為hello

示例3:刪除文件中的行

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的行

示例4:替換文件中的內容

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/[09][0−9]/(\1)/'   1.txt  #替換左側特殊字符需鑰轉義,右側不需要轉義,\1代表匹配的內容

sed  's/$/&'haha'/'  1.txt   # 在1.txt文件的每一行后面加上"haha"字段

示例5:打印文件中的行

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的行

示例6:打印文件的行號

sed  -n "$="   1.txt   #打印1.txt文件最后一行的行號(即文件有多少行,和wc -l 功能類似)

sed  -n '/error/='  1.txt     #打印匹配error的行的行號

sed  -n '/error/{=;p}'   1.txt    #打印匹配error的行的行號和內容(可用於查看日志中有error的行及其內容)

示例7:從文件中讀取內容

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的內容

示例8:向文件中寫入內容

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中

示例9:sed 在shell腳本中的使用

實例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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM