工作遇到需要在頁面一鍵操作,后端進(jìn)行自動(dòng)化運(yùn)維部署的事情,這里就用的了sed命令,linux的學(xué)問真的要花時(shí)間好好學(xué)習(xí)一番了!
上面圖片是AI創(chuàng)作生成!如需咒語可私戳哦!
以下為實(shí)際工作簡化后描述
需求背景
簡要說明下流程
原來的流程: 每次新增連接服務(wù),都要進(jìn)行命令行操作-修改配置文件A,執(zhí)行啟動(dòng)腳本 。
全部需要公司運(yùn)維人員幫忙操作,且每次新增都需要人工重復(fù)操作
現(xiàn)在的流程:
1.提前一次性配置好環(huán)境變量文件B中的必要參數(shù)
2.后續(xù)就交給程序來操作
3.根據(jù)頁面輸入的信息替換shell模版C內(nèi)容;
4.讀取環(huán)境變量B參數(shù)替換shell模版C內(nèi)容;
5.shell模版文件C替換完參數(shù)開始執(zhí)行替換文件A的命令
可以發(fā)現(xiàn)這里需要大量替換shell文件內(nèi)容的操作,如果是設(shè)置好的模板內(nèi)容,其實(shí)容易替換操作(詳見:《java:自定義變量加載到系統(tǒng)變量后替換shell模版并執(zhí)行shell》),但是對于特定內(nèi)容的替換,還是sed命令會(huì)容易些。
sed命令介紹
sed 是一種幾乎可以應(yīng)用在所有 UNIX 平臺(tái)(包括 Linux)上的輕量級流編輯器。sed 有許多很好的特性。首先,它相當(dāng)小巧,通常要比你所喜愛的腳本語言小多倍。其次,因?yàn)?sed 是一種流編輯器,所以,它可以對如管道這樣的標(biāo)準(zhǔn)輸入中接收的數(shù)據(jù)進(jìn)行編輯。因此,無須將要編輯的數(shù)據(jù)存儲(chǔ)在磁盤上的文件中。因?yàn)榭梢暂p易將數(shù)據(jù)管道輸出到 sed,所以,將 sed 用作強(qiáng)大的 Shell 腳本中長而復(fù)雜的管道很容易。
sed 主要是用來將數(shù)據(jù)進(jìn)行選取、替換、刪除、新増的命令。如下是命令的語法:
sed [選項(xiàng)] '[動(dòng)作]' 文件名
常用選項(xiàng):
- n:使用安靜(silent)模式。在一般sed 的用法中,所有來自 STDIN的資料一般都會(huì)被列出到螢?zāi)簧?。但如果加?-n 參數(shù)后,則只有經(jīng)過sed特殊處理的那一行(或者動(dòng)作)才會(huì)被列出來;
- e: 直接在指令列模式上進(jìn)行 sed 的動(dòng)作編輯;
- f :-f filename 則可以執(zhí)行 filename 內(nèi)的sed動(dòng)作。和 awk 命令的 -f 選項(xiàng)非常類似;
- r:在 sed 中支持?jǐn)U展正則表達(dá)式;
- i:直接修改讀取的文件內(nèi)容,而不是由屏幕輸出;
常用命令:
- a \:新增,在當(dāng)前行后添加一行或多行。當(dāng)添加多行時(shí),除最后一行外,每行末尾需要用“\”代表數(shù)據(jù)未完結(jié);
- c \:行替換,用c后面的字符串替換原數(shù)據(jù)行。當(dāng)替換多行時(shí),除最后一行外,每行末尾需用“\”代表數(shù)據(jù)未完結(jié);
- i \:插入,在當(dāng)前行前插入一行或多行。當(dāng)插入多行時(shí),除最后一行外,每行末尾需要用“\”代表數(shù)據(jù)未完結(jié);
- d:刪除,刪除指定的行;
- p:打印,輸出指定的行,通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)作;
- s:字符串替換,用一個(gè)字符串替換另一個(gè)字符串。格式為“行范圍s/舊字串/新字串/g”(和Vim中的替換格式類似);
??:這里需要注意,sed 所做的修改并不會(huì)直接改變文件的內(nèi)容(如果是用管道符接收的命令的輸出,則連文件都沒有),而是把修改結(jié)果只顯示到屏幕上,除非使用"-i"選項(xiàng)才會(huì)直接修改文件。
sed命令實(shí)操
接下來的操作都以測試數(shù)據(jù)-sedTest.sh為例:
原始數(shù)據(jù)如下
查
p:打印,輸出指定的行;
查-某行的數(shù)據(jù)
如只看第2行的數(shù)據(jù)
命令:
sed -n '2p' sedTest.sh
結(jié)果:
查-連續(xù)某幾行的數(shù)據(jù)
如看從第2行到第4行的數(shù)據(jù)
命令:
sed -n '2,4p' sedTest.sh
結(jié)果:
查-某行開始到最后一行的數(shù)據(jù)
如看從第2行到最后一行的數(shù)據(jù)
命令:
sed -n '2,$p' sedTest.sh
結(jié)果:
查-包括關(guān)鍵字的所有行數(shù)據(jù)
如查詢包含關(guān)鍵字-abc的所有行數(shù)據(jù)
命令:
sed -n '/abc/p' sedTest.sh
結(jié)果:
查-包括特殊關(guān)鍵字如$所在所有行
查詢包括關(guān)鍵字$所在所有行,使用反斜線\屏蔽特殊含義
命令:
sed -n '/\$/p' sedTest.sh
結(jié)果:
上面的實(shí)操命令可以看出:
- 所有的動(dòng)作必須使用"單引號(hào)"包含;
- 在動(dòng)作中可以使用數(shù)字代表行號(hào),逗號(hào)代表連續(xù)的行范圍;
- 還可以使用" $ " 代表最后一行,如果動(dòng)作是"2,$p",則代表查看從第二行到最后一行。
刪(不改變原文件)
d:刪除,刪除指定的行;
刪-某行數(shù)據(jù)
如刪除第3行的數(shù)據(jù)
命令:
sed '3d' sedTest.sh
結(jié)果:
但其實(shí)要知道,刪除只是刪除的展示結(jié)果,實(shí)際上原文件并沒有任何改動(dòng),如下:
增(不改變原文件)
a :新增,在當(dāng)前行后添加一行或多行;
增-某行后增加數(shù)據(jù)
如在第1行后增加數(shù)據(jù):YYDS
命令:
sed '1a YYDS' sedTest.sh
結(jié)果:
當(dāng)然,剛開始執(zhí)行語句的時(shí)候出現(xiàn)了問題,報(bào)錯(cuò):sed: 1: "1a YYDS": command a expects \ followed by text
,解決方法在下面
行替換(不改變原文件)
c :行替換,用c后面的字符串替換原數(shù)據(jù)行;
替換-某行數(shù)據(jù)
如替換第2行數(shù)據(jù)YYDS為:dddd
命令:
sed '2c dddd' sedTest.sh
結(jié)果:
字符串替換(不改變原文件)
s:字符串替換,用一個(gè)字符串替換另一個(gè)字符串
//(要替換的字符串可以用正則表達(dá)式)
sed 's/要替換的字符串/新的字符串/g'
字符串替換-某行的部分字符串
如替換123為:666
命令:
sed 's/123/666/g' sedTest.sh
結(jié)果:
字符串替換(改變原文件)
s:字符串替換,用一個(gè)字符串替換另一個(gè)字符串,使用 “-i” 選項(xiàng)才會(huì)直接修改文件。
//(要替換的字符串可以用正則表達(dá)式)
sed -i 's/要替換的字符串/新的字符串/g'
字符串替換-字符串
如替換123為:666
命令:
sed -i 's/123/666/g' sedTest.sh
結(jié)果:
字符串替換-匹配字符串全部替換
如替換6為:5
命令:
sed -i 's/6/5/g' sedTest.sh
結(jié)果:
字符串替換-每行第一個(gè)匹配的字符串替換
如每行第一次出現(xiàn)的5替換為:6
命令:
sed -i 's/5/6/' sedTest.sh
結(jié)果:
字符串替換-只替換第一個(gè)匹配的字符串
0,/待替換內(nèi)容/s/待替換內(nèi)容/替換內(nèi)容/
如第一個(gè)匹配的5替換為:6
命令:
sed -i '0,/5/s/5/6/' sedTest.sh
結(jié)果:
字符串替換-只替換第一行所有匹配的字符串
0,/待替換內(nèi)容/s/待替換內(nèi)容/替換內(nèi)容/g
如存在5的第一行所有的5替換為:6
命令:
sed -i '0,/5/s/5/6/g' sedTest.sh
結(jié)果:
字符串替換-每次替換兩行且只替換第一個(gè)匹配的字符串
1,/待替換內(nèi)容/s/待替換內(nèi)容/替換內(nèi)容/
如替換兩行且只替換第一個(gè)匹配的ab為:yzh
命令:
sed -i '1,/ab/s/ab/yzh/' sedTest.sh
結(jié)果:
文件修改
如修改文件內(nèi)容的yzh為:ddd
直接修改原文件
命令:
sed -i 's/yzh/ddd/g' sedTest.sh
結(jié)果:
可以看到修改了原文件內(nèi)容,且沒有其他文件產(chǎn)生
修改文件內(nèi)容,備份并重命名原文件(原文件名為修改后的文件內(nèi)容)
命令:
sed -in-place -e 's/yzh/ddd/g' sedTest.sh
結(jié)果:
可以看到修改了文件內(nèi)容,但是多出來一個(gè)文件sedTest.shn-place,并且該文件內(nèi)容是修改之前的內(nèi)容,所以是對修改前的文件備份
問題
1. 報(bào)錯(cuò)-mac上遇到的錯(cuò)誤sed command a expects followed by text
在執(zhí)行增加語句時(shí)
原因
由于mac系統(tǒng)與linux系統(tǒng)下sed用法的差異,(差異可自己在兩個(gè)系統(tǒng)用man命令查看幫助)
解決方法
1. mac上安裝gnu-sed
brew install gnu-sed
2. 調(diào)整mac下sed的用法,使其與linux一致
alias sed=gsed
3.問題解決,再次執(zhí)行會(huì)報(bào)錯(cuò)的語句就沒問題了
2. 報(bào)錯(cuò)-sed throws ‘bad flag in substitute command’
由于我這個(gè)問題無法復(fù)現(xiàn)了,也忘了當(dāng)時(shí)具體的情況了,這里就直接放我當(dāng)時(shí)解決參考的鏈接了
解決方法
sed 在替代命令中拋出“錯(cuò)誤標(biāo)志”----sed throws ‘bad flag in substitute command’
3. Sed命令中含有轉(zhuǎn)義字符的問題
在sed命令中有許多的字符都被轉(zhuǎn)義,比如\ , $,^,單雙引號(hào)還有點(diǎn)號(hào)等等,因此使用sed命令進(jìn)行字符串的匹配和修改的時(shí)候,字符串中如果含有轉(zhuǎn)義字符,很多情況下不能直接用字符本身表示。這時(shí)候可以使用反斜杠加上轉(zhuǎn)義字符的方法來輸出含轉(zhuǎn)義字符的字符串,但這一方法并不是對所有的轉(zhuǎn)義字符都有用,過程也較復(fù)雜。
如果你也遇到了類似的問題,那么可以參考這個(gè)鏈接:Sed命令中含有轉(zhuǎn)義字符的解決方法文章來源:http://www.zghlxwxcb.cn/news/detail-405880.html
由于做這個(gè)功能距今有幾個(gè)月的時(shí)間了,當(dāng)時(shí)具體遇到的問題,無法完全回想和復(fù)現(xiàn)了,就把當(dāng)時(shí)參考的鏈接放給大家參考吧,當(dāng)然如果有解決不了的問題,可以私信,我還是應(yīng)該可以幫忙解決一下的!文章來源地址http://www.zghlxwxcb.cn/news/detail-405880.html
到了這里,關(guān)于Linux:使用sed命令替換文件內(nèi)容實(shí)操及各種報(bào)錯(cuò)問題解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!