Bash字符串的處理

# 定義幾個變量用於測試目的
FILE_NAME="/usr/local/app/world.txt"
TIME_NOW="`date +"%Y%m%d%H%M%S"`"
1. 取字符串的子串, 好比說從TIME_NOW分別取出日期和時間
DATE_TODAY="${TIME_NOW:0:8}"    # ${var:beg_pos:sub_str_length}, beg_pos是子串的起始位置(從0開始), sub_str_length爲子串長度
TIME_TODAY="${TIME_NOW:8:6}"
# 或者
TIME_TODAY="${TIME_NOW:8}"      # sub_str_length爲0表示到源字符串的結尾
# 取FILE_NAME中的文件名world.txt(不包括路徑), 不少童鞋會立刻想到basename, 或者一些相似於正則匹配的操做
${FILE_NAME##*/}                # 至關於basename ${FILE_NAME},即刪除按從左至右,匹配一直到最後一個/之間的子串
${FILE_NAME%/*}                 # 至關與dirname, 即刪除按從右至左方向開始,匹配到第一個/之間的子串
${FILE_NAME#*/}                 # 從左至右, 刪除第一個/及左邊的子串
${FILE_NAME%%/*}                # 從右至左, 刪除至最後一個/及右邊的子串
2. 字符串替換
${FILE_NAME/world.txt/hello.txt}    # 把第一個world.txt替換成hello.txt
${FILE_NAME//a/A}                   # 把全部的a替換成A
%x=abcdabcd
%echo ${x/a/b} # 只替換一個
bbcdabcd
%echo ${x//a/b} # 替換全部
bbcdbbcd
3. 計算字符串長度
${#FILE_NAME}                   # 計算FILE_NAME的長度
ARRAY=(abc defg hijklmn)
${#ARRAY}                       # 計算這個數組的維數
${#ARRAY[2]}                    # 計算這個數組第三個元素的長度
4.basename是最經常使用的,除此以外,Bash中還有個用字符串處理的方法(適用於bash):
for i in /var/html/*
do
   echo $i #全路徑名
   echo ${i##*/} #文件名
done

#表示去除從指定字符向前全部的字符;##表示最大匹配。html

%表示去除從指定字符向後全部的字符;%%表示最大匹配。python

單個的表示最小匹配,雙個表示最大匹配。
也就是說,當匹配的有多種方案的時候,選擇匹配的最大長度仍是最小長度。數組

str="abbc,def,ghi,abcjkl"
echo ${str#a*c}     # 輸出,def,ghi,abcjkl  一個井號(#) 表示從左邊截取掉最短的匹配 (這裏把abbc字串去掉)
echo ${str##a*c}    # 輸出jkl,             兩個井號(##) 表示從左邊截取掉最長的匹配 (這裏把abbc,def,ghi,abc字串去掉)
echo ${str#"a*c"}   # 輸出abbc,def,ghi,abcjkl 由於str中沒有"a*c"子串
echo ${str##"a*c"}  # 輸出abbc,def,ghi,abcjkl 同理
echo ${str#*a*c*}   # 空
echo ${str##*a*c*}  # 空
echo ${str#d*f)     # 輸出abbc,def,ghi,abcjkl,
echo ${str#*d*f}    # 輸出,ghi,abcjkl  
 
echo ${str%a*l}     # abbc,def,ghi  一個百分號(%)表示從右邊截取最短的匹配
echo ${str%%b*l}    # a             兩個百分號表示(%%)表示從右邊截取最長的匹配
echo ${str%a*c}     # abbc,def,ghi,abcjkl
 能夠這樣記憶, 井號(#)一般用於表示一個數字,它是放在前面的;百分號(%)卸載數字的後面; 或者這樣記憶,在鍵盤佈局中,井號(#)老是位於百分號(%)的左邊(即前面)
5.去掉擴展名,匹配語句

for i in /var/html/*
do
   echo $i #全路徑名
   filename=${i##*/} #帶擴展名的文件名,用basename也能夠
   echo ${filename%.*} #去除擴展名的文件名
done
或者用sed的正則替換命令:

for i in /var/html/*
do
   echo $i #全路徑名
   echo $i|sed -r 's#.*/(.*)\..*#\1#' #去除擴展名的文件名
done
 或者用awk:

for i in /var/html/*
do
   echo $i #全路徑名
   echo $i|awk -F"[/.]" '{print $(NF-1)}' #去除擴展名的文件名
done
相關文章
相關標籤/搜索