1. 程式人生 > >shell編程 之 實踐出真知(代碼實例)

shell編程 之 實踐出真知(代碼實例)

計算 顯示 多次 family 字符串 一個 user mman tro

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編程 之 實踐出真知(代碼實例)