Linux指令碼中利用sed修改檔案內容的多種技巧

2021-07-31 14:24:56 字數 3089 閱讀 8561

linux指令碼中利用sed修改檔案內容

常用命令功能

a插入,在當前行後新增一行或多行。多行時需要在每行末尾需用「\」續行(最後不需要)

c替換,用此符號後的新文字替換當前行中的文字。多行時需要在每行末尾需用「\」續行(最後不需要)

d刪除,刪除行

i插入,在當前行之前插入文字。多行時需要在每行末尾需用「\」續行(最後不需要)

h拷貝模板塊的內容到記憶體中的緩衝區

g獲得記憶體緩衝區的內容,並替代當前模板塊中的文字

l列出非列印字元

n讀入下一輸入行,並從下一條命令而不是第一條命令開始對其的處理

p列印行

q結束或退出sed

r從檔案中讀取輸入行

!對所選行以外的所有行應用命令

s替換,用乙個字串替換另乙個。通常和正規表示式搭配使用:1,$ s/old/new/g

g在行內進行全域性替換

w將所選的行寫入檔案

x交換暫存緩衝區與模式空間的內容

y將字元替換為另一字元(不能對正規表示式使用y命令)

常用選項功能

-e進行多項編輯,即對輸入行應用多條sed命令時使用

-n取消預設的輸出,使用安靜(silent)模式。在一般 sed 的用法中,所有來自 stdin的資料一般都會被列出到螢幕上。但如果加上 -n 引數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來

-f指定sed指令碼的檔名

-i  直接修改讀取的檔案內容,而不是由螢幕輸出 

-r  sed的動作支援的是延伸型正規表示式的語法,想少用\  那你就用-r

[root@localhost test]# ls

test.sh

[root@localhost test]# vim test.sh 

#!/bin/sh

[root@localhost test]# ./test.sh 

please use: ./test.sh

[root@localhost test]# ./test.sh  1.1.1.1

[root@localhost test]# cat a.conf 

#config file

aaa_add_info_into_line2

ipaddr:1.1.1.1

mask:24 #or 255.255.255.0 is valid.

ccc_add_info_into_file_after_the_fix_line

pro:ipv4

bbb_add_info_into_the_last_line

[root@localhost test]# 

[root@localhost test]#./test.sh 2.2.2.2

[root@localhost test]# 

[root@localhost test]# cat a.conf 

#config file

aaa_add_info_into_line2

ipaddr:2.2.2.2

mask:24 #or 255.255.255.0 is valid. #or 255.255.255.0 is valid.

ccc_add_info_into_file_after_the_fix_line

ccc_add_info_into_file_after_the_fix_line

pro:ipv4

bbb_add_info_into_the_last_line

bbb_add_info_into_the_last_line

[root@localhost test]# 

如果要替換一行中的某個字串:

sed[root@localhost test]# cat test.sh 

#!/bin/sh

file="a.conf"

sed -i "/bin\/mysqld\ \-\-initialize/s/\-\-basedir=[^ ]*\ /\-\-basedir=\/usr\/local\/mysql\ /g" $file

[root@localhost test]# 

[root@localhost test]# cat a.conf 

bin/mysqld --initialize

--user=mysql  

--basedir=/abc/def

--datadir=/usr/***/yyy   >> /home/a.txt

tomcat  --basedir=/opt/tomcat/ ***x

[root@localhost test]# 

[root@localhost test]# ./test.sh 

[root@localhost test]# 

[root@localhost test]# cat a.conf 

bin/mysqld --initialize  --user=mysql  --basedir=/usr/local/mysql  --datadir=/usr/***/yyy   >> /home/a.txt

tomcat  --basedir=/opt/tomcat/ ***x

[root@localhost test]# 

替換一行中的一部分(非整行)

sed 's/被替換的字串/新的字串/g'

表示式支援正則

替換匹配行中的某個字串

sed -i '/匹配字串/s/替換源字串/替換目標字串/g' $file

# sed -i "/bin\/mysqld\ \-\-initialize/s/\-\-basedir=[^ ]*\ /\-\-basedir=\/usr\/local\/mysql\ /g" $file

# sed -n '/abc/p' $file | sed 's/abc/newabc/g'

# sed -n '/abc/p' $file | sed 's/abc//g'

直接在檔案末尾插入一行內容"end"

# sed -i '$a end' $file

替換單引號的幾種方法:

sed 's/'"'"'//g'

orsed 's/'\''//g'

orsed s/\'//g

Linux利用sed批量修改檔名

初始檔名 ls lh total 5.5g rw r r 1 root root 193k sep 28 09 38 20180908.txt drwxr xr x 2 root root 4.0k mar 7 16 37 batch rw r r 1 root root 160m mar 13 1...

linux下shell指令碼中sed命令使用變數

用linpack做測試,寫了乙個指令碼,因為每次可修改的引數寫在了配置檔案裡,所以指令碼裡用sed命令來修改配置檔案 測試次數 echo input number of tests read numt 每次測試的資料規模,測試次數有多少次,這裡應該又多少組數字,中間以空格隔開 echo input ...

shell指令碼利用sed命令分割檔案

前幾天有個需求,網路模組5秒定時傳回領區資訊並寫入檔案,需求為5分鐘後讀取檔案,提取每次傳回的領區資訊中的earfcn和rsrp等,每次傳回的資訊以 為分隔符 檔案格式如下 領區資訊.領區資訊.領區資訊.領區資訊.領區資訊.提取資訊前要先把每5秒傳回的資訊分割,然後再提取,所以就寫了一下的指令碼來提...