Shell 字串處理、擷取檔案名稱和尾碼名
來源:互聯網
上載者:User
【http://www.lichaozheng.info/2012/03/20/shell-擷取檔案名稱和尾碼名/】 代碼: file=”thisfile.txt” echo “filename: ${file%.*}” echo “extension: ${file##*.}” 輸出: filename: thisfile extension: txt 附: Bash字串處理 基於Pattern Matching的子串替換 ${STR/$OLD/$NEW} 替換第一個。 ${STR//$OLD/$NEW} 替換所有。 注意:不能使用Regex,只能使用?*的Shell擴充。只能用shell萬用字元如 * ? [list] [!list] [a-z]。 ${STR/#$OLD/$NEW} 替換開頭。如果STR以OLD串開頭,則替換。 ${STR/%$OLD/$NEW} 替換結尾。如果STR以OLD串結尾,則替換。 [user@laptop ~]# STR=”Hello World” [user@laptop ~]# echo ${STR/o/O} HellO World [user@laptop ~]# echo ${STR//o/O} HellO WOrld [user@laptop ~]# STR=”Hello World” [user@laptop ~]# echo ${STR/#He/he} hello World [user@laptop ~]# echo ${STR/#o/he} Hello World [user@laptop ~]# echo ${STR/%He/he} Hello World [user@laptop ~]# echo ${STR/%ld/lD} Hello WorlD 如果被替換串包含/字元,那麼要轉義,寫成\/。 [user@laptop ~]# filename=”/user/admin/monitoring/process.sh” [user@laptop ~]# echo ${filename/#\/user/\/tmp} /tmp/admin/monitoring/process.sh [user@laptop ~]# echo ${filename/%.*/.ksh} /user/admin/monitoring/process.ksh [user@laptop ~]# 將環境變數PATH的各個目錄分開,每行顯示一個。 echo -e ${PATH/:/\n} [user@laptop ctmw]# echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/user/bin [user@laptop ctmw]# echo -e ${PATH//:/’\n’} /usr/kerberos/sbin /usr/kerberos/bin /usr/apache/apache-ant-1.7.1/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /user/bin [user@laptop ctmw]# echo “${PATH//:/$’\n’}” /usr/kerberos/sbin /usr/kerberos/bin /usr/apache/apache-ant-1.7.1/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /user/bin 基於Pattern Matching的子串刪除 子串刪除是一種特殊的替換 ${STR/$SUB} 將STR中第一個SUB子串刪除 ${STR//$SUB} 將STR中所有SUB子串刪除 ${STR#$PREFIX} 去頭,從開頭去除最短匹配首碼 ${STR##$PREFIX} 去頭,從開頭去除最長相符首碼 ${STR%$SUFFIX} 去尾,從結尾去除最短匹配尾碼 ${STR%%$SUFFIX} 去尾,從結尾去除最長相符尾碼 注意:經常會記錯#和%的含義,有一個協助記憶的方法 看一下鍵盤,#在$之前,%在$之後,就知道#去頭,%去尾。 注意:不能使用Regex,只能使用?*的Shell擴充。 [user@laptop ~]# STR=”Hello World” [user@laptop ~]# echo ${STR#He} llo World [user@laptop ~]# echo ${STR#He*o} World [user@laptop ~]# echo ${STR##He*o} rld [user@laptop ~]# PREFIX=”*o” [user@laptop ~]# echo ${STR#$PREFIX} World [user@laptop ~]# echo ${STR##$PREFIX} rld [user@laptop ~]# echo ${STR%o*} Hello W [user@laptop ~]# echo ${STR%%o*} Hell [user@laptop ~]# SUFFIX=”o*” [user@laptop ~]# echo ${STR%$SUFFIX} Hello W [user@laptop ~]# echo ${STR%%$SUFFIX} Hell 典型應用:得到檔案的副檔名 [user@laptop ~]# FILE=hello.jpg [user@laptop ~]# echo ${FILE##*.} jpg 使用sed命令實現Regex替換 使用sed命令可以進行Regex的替換。 echo “$STR” | sed “s/$OLD/$NEW/” 將STR中的OLD子串替換成NEW。 [user@laptop ~]# STR=”123456789″ [user@laptop ~]# echo “$STR” | sed s/345/OK/ 12OK6789 [user@laptop ~]# OLD=345 [user@laptop ~]# NEW=OK [user@laptop ~]# echo “$STR” | sed “s/$OLD/$NEW/” 12OK6789 使用tr命令實現字元集合的替換 使用tr命令可以實現字元的替換,並且可以是從一批字元到另一批字元的替換。比如小寫字母變成大寫字母,或者反過來。 [user@laptop ~]# echo “bash” | tr “[a-z]” “[b-z]” cbti 上面的命令是將原串中的a替換成b,被替換成c,以此類推。 網上問題:Linux中 有沒有一個命令可以將 字串中出現的 +或者- 替換成對應的-或者+ 即 “+” ——> “-” “-”——>”+” 例如 GMT+8-9變成 GMT-8+9 [user@laptop ~]# echo “GMT+8-9″ | sed ‘s/-/#/g’ | sed ‘s/+/-/g’ | sed ‘s/#/+/g’ GMT-8+9 上面是網上提供的答案。如果用tr來實現,更簡潔些。 [user@laptop ~]# echo “GMT+8-9″ | tr “+-” “-+” GMT-8+9 路徑字串的處理 dirname ${FULLPATH} 取目錄部分。 basename ${FULLPATH} 取檔案名稱部分。 basename ${FULLPATH} ${EXT} 取檔案名稱部分,並且去掉指定的副檔名。 [user@laptop ~]# FULLPATH=/user/work/project/backup.tar.gz [user@laptop ~]# dirname “$FULLPATH” /user/work/project [user@laptop ~]# basename “$FULLPATH” backup.tar.gz [user@laptop ~]# basename “$FULLPATH” .gz backup.tar [user@laptop ~]# basename “$FULLPATH” .tar backup.tar.gz [user@laptop ~]# basename “$FULLPATH” .tar.gz backup 取目錄部分:${FULLPATH%/*} (類似 dirname “$FULLPATH”) 取檔案名稱:FILE=${FULLPATH##*/} (類似 basename “$FULLPATH”) 取最短基本名稱:${FILE%%.*} 取最長基本名稱:${FILE%.*} 取最短副檔名:${FILE##*.} 或者 ${FULLPATH##*.} 取最長副檔名:${FILE#*.} 或者 ${FULLPATH#*.} [user@laptop ~]# FULLPATH=/user/work/project/backup.tar.gz [user@laptop ~]# echo ${FULLPATH%/*} /user/work/project [user@laptop ~]# dirname “$FULLPATH” /user/work/project [user@laptop ~]# FILE=${FULLPATH##*/} [user@laptop ~]# echo $FILE backup.tar.gz [user@laptop ~]# basename “$FULLPATH” backup.tar.gz [user@laptop ~]# echo ${FILE%%.*} backup [user@laptop ~]# echo ${FILE%.*} backup.tar [user@laptop ~]# echo ${FILE##*.} gz [user@laptop ~]# echo ${FILE#*.} tar.gz [user@laptop ~]#