perl輸出匹配的當前行以及下一行_詳解Linux sed 命令語法、以及經典50例
技術標籤:perl輸出匹配的當前行以及下一行
因經常要在伺服器上修改差不多的配置檔案,比如新搭建一臺web環境,通過映象啟動後,某些配置檔案需要修改,
需求:有超過10多個php專案的.env檔案需要把資料庫連結地址、使用者名稱更換為新的。
如果一兩個修改修的話通過vim很方便修改,但如果10多個甚至幾十個的配置修改。一個個改就不是程式設計師的風格了。那能不能不開啟檔案就直接修改呢。你能想到的90%都被人實現了。那就看看SED吧。下文是老外都總結好了的,我機器(翻譯)成了中文。但例子還是得自己來一邊的。這樣自己才能學會。let's go.
基礎知識要求:瞭解linux正則、管道符、cat命令
sed例項介紹
sed是GNU / Linux的有用的文字處理功能。sed的完整形式是Stream Editor。通過使用sed命令可以很容易地完成許多型別的簡單和複雜的文字處理任務。可以使用帶有sed命令的正則表示式來搜尋,替換和刪除文字或檔案中的任何特定字串。但是此命令會臨時執行所有型別的修改,並且預設情況下不會更改原始檔案內容。如果需要,使用者可以將修改後的內容儲存到另一個檔案中。sed命令的基本用法在本教程中通過使用50個獨特的示例進行了說明。
為了使大家方便閱讀對輸出進行縮排,
[[email protected]]$ cat os.txt Windows Linux Android OS
真正的輸出為
[[email protected]]$ cat os.txtWindowsLinuxAndroidOS
在開始本教程之前,您必須通過執行以下命令來檢查作業系統中sed的安裝版本。本教程基於GNU sed設計。因此,需要使用此版本的sed來練習本教程中顯示的示例。
[[email protected]]$ sed --versionsed (GNU sed) 4.2.2.....
我機器上的是4.2.2
sed [options]… [script] [file]sed[選項]…[指令碼][檔案]
如果sed命令沒有提供檔名,那麼該指令碼將在標準輸入資料上執行。sed指令碼無需任何選擇即可執行。
示例列表
1、使用“ sed”進行基本文字替換
[[email protected]]$ echo "php是最好的語言" | sed 's/php/Python/'Python是最好的語言
sed命令也可以用來替換檔案內容的任何部分。建立一個名為weekday.txt的文字檔案,其內容如下。
weekday.txt
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
cat weekday.txt[[email protected]]$ sed 's/Sunday/Sunday is holiday/' weekday.txt
輸出:
執行上述`sed`命令後,“ dayday”存在於weekday.txt檔案中,該詞被文字“ Sunday is holiday”替換。但檔案內容並沒有真正的變化
2、使用“ g”選項替換檔案特定行中所有文字例項
'sed'命令中使用'g'選項來替換所有匹配模式。使用以下內容建立一個名為python.txt的文字檔案,以瞭解'g'選項的用法。該檔案包含多個“ Python”。
為了方便學習,我把原來的python.txt的內容修改為下面的了。不用介意語法。
python.txt
Python is a very popular language. Python is easy extended.Python is easy to use. Python is easy to learn. Python is usefull.Python is a cross-platform language.
只替換第一次出現 的位置
php is a very popular language. Python is easy extended.php is easy to use. Python is easy to learn. Python is usefull.php is a cross-platform language.
在上子命令g
Python is a very popular language. Python is easy extended.Python is easy to use. Python is easy to learn. Python is usefull.Python is a cross-platform language. [[email protected] sed]# sed 's/Python/Php/g' python.txtPhp is a very popular language. Php is easy extended.Php is easy to use. Php is easy to learn. Php is usefull.Php is a cross-platform language.
以下命令將替換檔案python.txt第二行中所有出現的“ Python ” 。在這裡,“ Python”在第二行中出現了三次次。
輸出:
[[email protected]]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. [[email protected]]$ sed '2 s/Python/perl/g' python.txt Python is a very popular language. Python is easy extended. perl is easy to use. perl is easy to learn. perl is usefull. Python is a cross-platform language.
3、僅替換第二個以後的匹配項
如果某個單詞在檔案中多次出現,則可以通過使用帶有出現編號的“ sed”命令來替換每行中該單詞的特定出現。下面的“ sed”命令將替換檔案python.txt中每一行中第二次以後出現的搜尋模式。
為了更清楚的演示功能,我把python.txt修改為以下內容
替換第二個以後的
替換第二個以後的Python is a very popular language Python.Python is easy to use. Python is easy to learn. Python is usefull.Python is a cross-platform language[[email protected] sed]# cat python.txt Python is a very popular language Python.Python is easy to use. Python is easy to learn. Python is usefull.Python is a cross-platform language替換第二個以後的[[email protected] sed]# sed 's/Python/php/g2' python.txt Python is a very popular language php.Python is easy to use. php is easy to learn. php is usefull.Python is a cross-platform language
替換第三個以後的
[[email protected]]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. [[email protected]]$ sed 's/Python/php/g3' python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. php is usefull. Python is a cross-platform language.
4、僅替換最後一行匹配項,當然如果這行只有一個,也會被替換掉
$ sed 's/(.*)Python/1Php/' python.txt Python is a very popular language. Php is easy extended. Python is easy to use. Python is easy to learn. Php is usefull. Php is a cross-platform language.
5、僅替換第一齣現的匹配項
sed 's/(.*)Python/1Php/' python.txt
6、匹配最後行出現的匹配項,也就是匹配最後一行的,第一個匹配項.
“ $”符號用於匹配模式的最後一行
[[email protected]]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. [[email protected]]$ sed '$ s/Python/php/' python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. php is a cross-platform language.當我添加了一個Python以後並沒有被替換掉[[email protected]]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. Python[[email protected]]$ sed '$ s/Python/php/' python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. php is a cross-platform language. Python
7、反斜槓來轉義路徑,其實正則分隔符可以指定,看著就沒有那麼鬧心了,比如用;
[[email protected]]$ echo /home/ubuntu/code/perl/add.pl | sed 's///---/g' ---home---ubuntu---code---perl---add.pl[[email protected]]$ echo /home/ubuntu/code/perl/add.pl | sed 's;/;---;g' ---home---ubuntu---code---perl---add.pl
8、將檔案絕對路徑更換為無目錄,只剩下檔名
[[email protected]]$ echo "/home/ubuntu/temp/myfile.txt" | sed 's/.*///'myfile.txt
9、替換中的判斷,當某些檔案存在才替換
建立文字檔案dept.txt
在包含文字“ CSE ” 的行中把Count替換為100,包含“ EEE”的行中替換為70
CSE - CountEEE - CountCivil - Countbogon:yy-api zhangjuntao$ sed -e '/CSE/ s/Count/100/; /EEE/ s/Count/70/;' dept.txtCSE - 100EEE - 70Civil - Count
10、判斷不存在的時候替換
不包含文字“ CSE”的行把“ Count ”替換為80。
[[email protected]]$ cat dept.txt CSE - Count EEE - Count Civil - Count[[email protected]]$ sed -e'/CSE/! s/Count/80/;' dept.txt CSE - Count EEE - 80 Civil - 80
11、在匹配模式之前和之後使用' 1'新增字串
[[email protected]]$ echo "Bash language" | sed 's/(Bash)/Learn 1 programming/' Learn Bash programming language
12、刪除匹配的行
d選項可以刪除匹配的行
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed '/OS/d' os.txt Windows Linux Android
13、刪除匹配行和匹配行之後的2行
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed '/Linux/,+2d' os.txt Windows
14、刪除文字行末尾的所有空格
[[email protected]]$ cat -E os.txt Windows$ Linux 1$ Android $ OS$[[email protected]]$ sed -i 's/[[:blank:]]*$//' os.txt[[email protected]]$ cat -E os.txt Windows$ Linux 1$ Android$ OS$
15、刪除該行兩次匹配的所有行
“ PHP”文字在檔案input.txt第二行中包含兩次。在此示例中,使用了兩個`sed'命令來兩次刪除包含模式' php '的那些行。第一個“ sed”命令將每行中第二個出現的“ php”替換為“ dl ”,並作為輸入傳送到第二個“ sed”命令中。第二條“ sed”命令將刪除包含文字“ dl ”的行。
[[email protected]]$ cat input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP is platform-independent.[[email protected]]$ sed 's/php/dl/i2;t' input.txt | sed '/dl/d' PHP is a server-side scripting language. PHP is platform-independent.
16、刪除所有隻有空格的行
[[email protected] sed]# vim os.txt 1 Windows$ 2 ^I $ 3 Linux$ 4 ^I $ 5 Android$ 6 $ 7 OS$ 8 $~ sed '/^$/d' input.txt
17、刪除所有不可列印的字元
通過將不可列印字元替換為空,可從任何文字中刪除不可列印字元。在此示例中,使用[:print:]類來查詢不可列印的字元。' t'是不可列印的字元,不能由`echo`命令直接解析。為此,在'echo'命令中使用的$tab變數中分配了' t'字元。echo命令的輸出在sed命令中傳送,該命令將從輸出中刪除字元' t'。
[[email protected]]$ tab=$''[[email protected]]$ echo Hello"$tab"WorldHelloWorld[[email protected]]$ echo Hello"$tab"World | sed 's/[^[:print:]]//g'HelloWorld
18、向匹配行的行末新增內容
以下命令將在os.txt檔案中包含文字“ Windows”的行的末尾追加“10”
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed '/Windows/ s/$/ 10/' os.txt Windows 10 Linux Android OS
19、在匹配行之前插入一行
[[email protected]]$ cat input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP is platform-independent.[[email protected]]$ sed '/PHP is platform-independent/ s/^/PHP 是世界上最好的語言./' input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP 是世界上最好的語言. PHP is platform-independent
20、在匹配行之後插入一行
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed 's/Linux/&Ubuntu/' os.txt Windows Linux Ubuntu Android OS
21、向不匹配的行末尾新增內容
以下“ sed”命令將在os.txt中搜索不包含“ Linux”文字的行,並在每行末尾附加文字“ Operating System ”。在這裡,“ $”符號用於標識將要附加新文字的行。
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed '/Linux/! s/$/ Operating System/' os.txt Windows Operating System Linux Android Operating System OS Operating System
22、刪除不匹配的行
[[email protected]]$ cat web.txt HTML 5 JavaScript CSS PHP[[email protected] sed]# sed '/CSS/!d' web.txt CSS
23、在匹配的單詞後面新增空格
在文字中尋找to單詞,如果找到
“&”符號用於附加重複的文字。
to後面變成了兩個空格
[[email protected]]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. [[email protected]]$ sed -e 's/to /& to/g' python.txt Python is a very popular language. Python is easy extended. Python is easy to touse. Python is easy to tolearn. Python is usefull. Python is a cross-platform language.
24、用新字串替換一個字串列表
這個功能太有用了,以前都是寫程式陣列迴圈的。這個邏輯有點繞。
[[email protected]]$ cat list1.txt 1001 => 濤哥 1023 => 李四 1067 => 王五[[email protected]]$ cat list2.txt 1001 北大 平均分-3.63 1002 北大 平均分-3.24 1023 北大 平均分-3.11 1067 北大 平均分-3.84[[email protected]]$ sed `cat list1.txt | awk '{print "-e s/"$1"/"$3"/"}'`<<
25、用包含換行符的字串替換匹配的字串
其實就是用表示換行
[[email protected]]$ echo "Bash Perl Python Java PHP ASP"| sed 's/Python/Added Text/'Bash Perl Added Text Java PHP ASP[[email protected] sed]# echo "Bash Perl Python Java PHP ASP"| sed 's/Python/Added Text/'Bash Perl Added Text Java PHP ASP
26、從檔案中刪除換行符,並在每行末尾插入一個逗號
知識點和上一個一樣都是換行知識點。以前都是用編輯器替換的,以後不用開啟檔案直接搞定。
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed -z 's//,/g' os.txt Windows,Linux,Android,OS,
27、刪除逗號並新增換行符以將文字分成多行
和26執行相反的操作,把逗號替換為換行。
[[email protected]]$ echo "Kaniz Fatema,30th,batch" | sed "s/,//g"
28、查詢不區分大小寫的匹配並刪除行
知識點字母I不區分大小寫
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed '/linux/Id' os.txt Windows Android OS
29、查詢不區分大小寫的匹配項並替換為新文字
[[email protected]]$ echo "我喜歡bash程式設計" | sed 's/Bash/PHP/i'我喜歡PHP程式設計
30、查詢不區分大小寫的匹配項,並替換為相同文字的所有大寫字母
sed中使用' U'將任何文字轉換為全部大寫字母。
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed 's/(linux)/U1/Ig' os.txt Windows LINUX Android OS
31、查詢不區分大小寫的匹配項,並替換為相同文字的所有小寫字母
sed中使用' L'將任何文字轉換為所有小寫字母。
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed 's/(linux)/L1/Ig' os.txt Windows linux Android OS
32、用小寫字元替換文字的所有大寫字元
[[email protected]]$ echo 'Windows Linux' |sed 's/(.*)/L1/'
33、在行中搜索數字,並在數字之前附加貨幣符號
[[email protected]]$ cat items.txt 硬碟 1000 顯示器 800 滑鼠 100[[email protected]]$ sed 's/([1-9])/¥1/g' items.txt 硬碟 ¥1000 顯示器 ¥800 滑鼠 ¥100
34、在數字上每超過3位後新增逗號
[[email protected]]$ echo "5098673" | sed -e :a -e 's/(.*[0-9])([0-9]{3})/1,2/;ta'5,098,673
35、用4個空格字元替換製表符
[[email protected] sed]#echo -e "123" | sed $'s// /g'
36、用製表符替換連續的四個空格字元
# echo -e "1 2" | sed $'s/ //g'12
37、將所有行截斷為前10個字元
[[email protected]]$ cat in.txt PHP是伺服器端指令碼語言。 PHP是一種開源語言,PHP區分大小寫。PHP是與平臺無關的。 以下“ sed”命令會將in.txt檔案的每一行截斷為80個字元。[[email protected]]$ sed 's/(^.{1,10}).*/1/' in.txt PHP是伺服器端指令碼 PHP是一種開源語言 以下“ sed”命令
38、搜尋字串正則表示式,並在其後附加一些標準文字
[[email protected] sed]#$ echo "hello, how are you?" | sed 's/(hello)/1 John/'
39、搜尋字串正則表示式,並在每行的第二個匹配項之後附加一些文字
[[email protected]]$ cat input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP is platform-independent.[[email protected]]$ sed 's/(PHP)/1 (我是新加的)/2' input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP (我是新加的) is case-sensitive. PHP is platform-independent.
40、通過指定檔案執行多個SED命令
知識點通過-f 指定命令檔案
[[email protected]]$ cat sedcmd s/PHP/ASP/ s/independent/dependent/[[email protected]]$ cat input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP is platform-independent.[[email protected]]$ sed -f sedcmd input.txt ASP is a server-side scripting language. ASP is an open-source language and PHP is case-sensitive. ASP is platform-dependent.
41、匹配多行模式並替換為新的多行文字
下面的“ sed”命令將搜尋多行文字“ Linux nAndroid”,如果模式匹配,則匹配行將被多行文字“ Ubuntu nAndroid Lollipop ” 替換。此處,P和D用於多行處理。
42、替換文字中與模式匹配的兩個單詞的順序
[[email protected]]$ echo "perl python" | sed -e 's/([^ ]*) *([^ ]*)/2 1/'
43、從命令列執行多個“ sed”命令
[[email protected]]$ echo "Ubuntu Centos Debian" | sed -e 's/Ubuntu/Kubuntu/; s/Centos/Fedora/'
44、將sed與其他命令結合
先通過cat命令讀取檔案,作為下個sed的輸入,然後執行完,再傳給下個sed
管道符的學習和應用
[[email protected] sed]# cat os.txt | sed 's/Linux/Fedora/'| sed 's/windows/Windows 10/i'Windows 10FedoraAndroidOS
45、在檔案中插入空行
'G'選項用於在檔案中插入空行。
這個在我的linux伺服器上執行不成功,應該是版本低,4.2.2的在我的mac上成功了。
而且mac不支援sed --version 算了不折騰他,畢竟都是在linux上使用呢。僅供參考
bogon:tmp zhangjuntao$ cat 1.txt111222333bogon:tmp zhangjuntao$ sed G 1.txt111222333
46、替換掉字母數字符。
$ cat stdlist #ID #Name[101] -zhangsan[102] -zhangsanfeng$ sed 's/[A-Za-z0-9]//g' stdlist # #[] -[] -
47、使用“&”列印匹配的字串
以下命令將搜尋以“ L”開頭的單詞,並通過使用“&”符號將“匹配的字串為– ” 附加到匹配的單詞,從而替換文字。在此,“ p”用於列印修改後的文字。
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed -n 's/^L/Matched String is - &/p' os.txtMatched String is - Linux
48、把檔案中的兩列對調
[[email protected] sed]# cat course.txt PHP ASPMySQL OracleCodeIgniter Laravel[[email protected] sed]# sed 's/([^ ]*) *([^ ]*)/2 1/' course.txtASP PHPOracle MySQLLaravel CodeIgniter擴充套件下、只保留PHP ASP javaMySQL Oracle db2CodeIgniter Laravel yii[[email protected] sed]# sed 's/([^ ]*) *([^ ]*)*([^ ]*)/1 3/' course.txtPHP javaMySQL db2CodeIgniter yii
49、大寫每個單詞的第一個字元
[[email protected]]$ echo "I like bash programming" | sed 's/([a-z])([a-zA-Z0-9]*)/u12/g'I Like Bash Programming
50、列印檔案的行號
[[email protected]]$ cat os.txt Windows Linux Android OS[[email protected]]$ sed '=' os.txt 1 Windows 2 Linux 3 Android 4 OS
上面的教程通過使用非常簡單的示例說明了sed命令的不同用法。這裡提到的所有`sed`指令碼的輸出都是臨時生成的,原始檔案的內容保持不變。可以使用sed命令的–i或–in-place選項修改原始檔案。
[[email protected]]$ sed -i '=' os.txt[[email protected]]$ cat os.txt 1Windows2Linux3Android4OS
sed使用好了可以大幅度提高檔案的修改速度,但如果要加-i選項對伺服器檔案修改,有一定危險性。
一定提前備份;
一定提前備份;
一定提前備份;
替換步驟
- 對檔案備份
- 用臨時檔案做測試
- 替換或者先輸出檢查
- 用vimdiff等對比工具對比
總結 格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
歡迎點贊,評論,轉發,收藏!!!
有不對的感謝指正!!!