shell編程 之 實踐出真知(代碼實例)
1,在任意一個文件夾裏,新建10個空文件,文件名為t1.txt -t10.txt ,文件內容分別是11-20 ,就一行,然後把這個10個文件命名成t1.sh-t10.sh。
老司機版:
$ for (( i=1;i<=10;i++ )) ;do p=`expr $i + 10 `;echo $p >>"t"${i}.txt; done #創建加寫入
$ for fie in `ls *txt` ;do p=`basename $fie .txt` ;mv $fie ${p}.sh ;done #重命名
小菜鳥版:
#!/bin/bash
for i in {1..10} #創建加寫入
do
touch test$i.txt
echo `expr $i + 10 `>test$i.txt
done
rename ‘s/txt/sh/‘ * #重命名
問題:
sed和 rename這兩個命令還挺深奧,改天總結一下。可參考:https://www.cnblogs.com/AloneSword/p/5072698.html
sed命令:
當下文件夾裏有haha.sh,內容是:
abc
cdfa
ghia
jkla lm=abc
mnoa
pqr
stu
vwx
yz
基本格式:
sed [options] ‘command‘ file(s) ,比如:實例1 :sed ‘s/a/b/g‘ filename 註意,是單引號(大部分時候單雙通用,但是少數情況單雙不同,比如\$).默認在輸出中改,不在源文件中改
基本參數:
-n安靜模式 ,不顯示全文,只顯示改動了的或者與命令有關的行,和p配合使用哦。p:打印指定行
-i不只是在終端輸出結果,同樣修改結果到源文件中 這麽用:sed -i ‘s/a/A/g‘ haha.sh
-r用擴展正則表達式匹配,默認普通正則表達式,
sed -r "s/(lm=).*/\1 bcd/g" haha.sh 相當於sed -r "s/lm=.*/lm=bcd/g" haha.sh,但是明顯高端很多。比如下面這個:
echo "wo he ni"|sed -r ‘s/(wo)(.*)(ni)/\3\2\1/g‘ sed裏小括號的順序默認是\1,\2,\3,函數返回ni he wo
-e支持sed後有多項命令
sed -e "s/a/A/g;s/b/B/g" haha.sh 或者 sed -e "s/a/A/g" -e "s/b/B/g" haha.sh 在文件中同時替換a和b,第一個例子可以不加-e。
-f指定執行filename文件中的命令,應該是有編譯功能的
假設有個文件名字叫tmp,文件裏內容是s/a/A/g;s/b/B/g,那麽我們可以直接用tmp來替換
sed -f tmp haha.sh 在文件中同時替換a和b
sed中特有的命令:比如上一個實例1中的‘s‘ 和‘g‘
s 表示行內單詞或者字母的替換:s類似於y軸,g類似於x軸,s定位行,g定位行內的第幾個
sed ‘s/a/A/g‘ haha.sh 全文把a替換成A
sed ‘1s/a/A/g‘ haha.sh 只在第一行中把a替換成A,默認輸出haha.sh的所有替換過的內容,加上-n以後,就是之輸出改動過的內容,即改過的第一行
sed ‘s/a/A/2g‘ haha.sh 在所有的行中把每行第二個a變成A,
sed ‘1s/.*/AINI/g‘ haha.sh 把第一行整行內容替換成AINI,.*的意思是正則匹配所有字符。
sed " s/haha/${a}/g" haha.sh 把文本haha替換成變量a,變量a可以是自己賦值的,也可以是別的命令或者程序計算得來的。
c 整行替換
sed ‘c 123‘ haha.sh 默認是把所有的行都替換成123,不用管內容,(空格可以用斜杠替換)
sed ‘2c 123‘ haha.sh 把第二行改成123,別的不變。
a 相當於add,添加一行內容到指定的行後邊
sed ‘a 123 456 789‘ haha.sh 默認把每一行的後面添加上123 456 789
sed ‘1a 123456‘ haha.sh 在第一行的後面添加一行123456
p 打印指定行,通常與-n參數配合使用
sed -n ‘s/a/A/p‘ haha.sh 打印出所有執行了替換的行,註意,此處的p不可以用g替代。
sed -n ‘5p‘ haha.sh 打印出haha.sh的第五行
sed -n ‘2,5p‘ haha.sh 打印出haha.sh的2-5行
sed -n ‘/c.f/p‘ haha.sh 打印出符合正則c.f的所有匹配的行,註意,第一個斜杠是必須的
d 刪除指定行
sed ‘1,5d‘ haha.sh 刪除haha.sh中的指定行
sed ‘/^\s*$/d‘ haha.sh 刪除空行
rename命令
基本格式:
sed [options] ‘command‘ file
options:
-v 顯示成功重命名的文件 實例1:rename -v ‘s/suibian/abc/‘ * suibian更名為abc,會附帶提示:suibian renamed as abc
-n 不是真的去改名,而是用做測試,該命令會把要改要改的文件打印出來 實例:rename -n ‘s/abc/suibian/‘ * 把abc變成suibian, 結果:rename(abc, suibian)
-f 則表示會強制修改。
rename中的替換命令
基本和sed一樣,常用s和g,另外,這倆命令最好只用單引號,單引號內部支持轉義。
實例:
rename ’s/a/A/g‘ * 當前文件夾下所有文件名中帶a的全替換成A。*表示所有文件。
rename ‘s/a/A/’ *.txt d當前文件夾下所有txt文件中,有a的都變成A,”g"可省。
rename ‘s/$/S/‘ * 把所有文件的末尾添加一個S,rename ‘s/\$/S/‘ * 把文件名的末尾是“$”符號的那個文件,改成文件末尾是S. 但是,如果改用雙引號或者不加引號,不論是否添加了轉移符號,結果都是在每個文件的末尾添加了S,可見rename還是多用單引號才好。
rename -n ‘s/\.sh//‘ *.sh 把所有.sh結尾的文件去掉後綴名.
rename -n ‘s/[1]/number/‘ *.sh 把文件名中含有數字1的,其中的1替換成number
常用的正則匹配格式
x? 匹配 0 次或一次 x 字符串
x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次數 x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次數 .* 匹配 0 次或一次的任何字符 .+ 匹配 1 次或多次的任何字符 {m} 匹配剛好是 m 個 的指定字符串 {m,n}匹配在 m個 以上 n個 以下 的指定字符串 [] 匹配符合 [] 內的字符 [^] 匹配不符合 [] 內的字符 [0-9]匹配所有數字字符 [a-z]匹配所有小寫字母字母 ^ 匹配某字符開頭的字符 $ 匹配字符結尾的字符 \d 匹配一個數字的字符,和 [0-9] 語法一樣 \d+ 匹配多個數字字符串,和 [0-9]+ 語法一樣 \w 英文字母或數字的字符串,和 [a-zA-Z0-9] 語法一樣 \W 非英文字母或數字的字符串,和 [^a-zA-Z0-9] 語法一樣 \s 空格,和 [\n\t\r\f] 語法一樣 a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串
shell編程 之 實踐出真知(代碼實例)