Shell 字符串處理、獲取文件名和后綴名


 
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}
替換所有。
注意:不能使用正則表達式,只能使用?*的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}
去尾,從結尾去除最長匹配后綴
注意:經常會記錯#和%的含義,有一個幫助記憶的方法
看一下鍵盤,#在$之前,%在$之后,就知道#去頭,%去尾。
注意:不能使用正則表達式,只能使用?*的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命令實現正則表達式替換
使用sed命令可以進行正則表達式的替換。
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 ~]#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM