注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

随机过程

http://superware.blog.163.com

 
 
 

日志

 
 

Matching name and suffix in Bash Shell  

2015-01-13 22:17:09|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、实例


#!/bin/bash


full_dir_file_name=/home/stevens/include.gnuplot

full_name=$(basename "$full_dir_file_name")

file_name="${full_name%.*}"

extension="${full_name##*.}"


echo "File name is: ${file_name}"

echo "Extension is: ${extention}"


运行结果:

File name is: include

Extention is: gnuplot


二、详解

“111*" 叫正则字符串,是用来去匹配其他字符串的字符串。

--*-- 匹配紧接着前面的任意个数的重复字符串或正则表达式
“1133*” 匹配 11 + 一个或多个 3,比如: 113,1133,11333,113333,等。

--.-- 匹配任何字符,除非新行符号
"113." 匹配 113 + 至少一个字符,包括空格,比如:1133,11333。但 113 不行因为没有外加的字符。

--^-- 匹配一行的开头,但也可能在某中条件下是“非”运算符

--$-- 在正则字符串末尾用来匹配行尾
“xxx$” 匹配行尾的 xxx


--[...]-- 包括一系列正则字符串
“[xyz]" 匹配 x, y, z, 中的任何一个字符串。

"[c-n]" 匹配 c 到 n 中的任何一个字符。

"[a-z0-9]" 匹配任一小写字符或数字。

"[^b-d]" 匹配除了 b 到 d 之间的字符外的任一字符。

--\-- 转意字符


${FILENAME%.*} # 匹配右边从 . 开始的最小串,并将其去掉

${FILENAME%%.*} # 匹配右边从 . 开始的最大串,并将其去掉
${FILENAME$*.} # 匹配左边从 . 开始的最小串,并将其去掉

${FILENAME$$*.} # 匹配左边从 . 开始的最大串,并将其去掉

FILE="example.tar.gz"
 
echo "${FILE%%.*}" # %%.* 匹配右边从 . 开始的最长串,并将其去掉。
# => example
 
echo "${FILE%.*}" # %.* 匹配右边从 . 开始的最短串,并将其去掉。
# => example.tar
 
echo "${FILE#*.}" # #*. 匹配左边从 . 开始的最短串,并将其去掉。
# => tar.gz
 
echo "${FILE##*.}" # ##*. 匹配左边从 . 开始的最长串,并将其去掉。
# => gz
 
# 在bash中可以这么写
filename=$(basename "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"


為了完整起見,我這裡再用一些例子加以說明 ${ } 的一些特異功能:
假設我們定義了一個變量為:

file=/dir1/dir2/dir3/my.file.txt


我們可以用 ${ } 分別替換獲得不同的值:

${file#*/}: 拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt ${file##*/}: 拿掉最後一條 / 及其左邊的字串:my.file.txt ${file#*.}: 拿掉第一個 . 及其左邊的字串:file.txt ${file##*.}: 拿掉最後一個 . 及其左邊的字串:txt ${file%/*}: 拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3 ${file%%/*}: 拿掉第一條 / 及其右邊的字串:(空值) ${file%.*}: 拿掉最後一個 . 及其右邊的字串:/dir1/dir2/dir3/my.file ${file%%.*}: 拿掉第一個 . 及其右邊的字串:/dir1/dir2/dir3/my


記憶的方法為:

# 是去掉左邊(在鑑盤上 # 在 $ 之左邊)
% 是去掉右邊(在鑑盤上 % 在 $ 之右邊)
單一符號是最小匹配﹔兩個符號是最大匹配。


${file:0:5}:提取最左邊的 5 個字節:/dir1 ${file:5:5}:提取第 5 個字節右邊的連續 5 個字節:/dir2


我們也可以對變量值裡的字串作替換:

${file/dir/path}:將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt ${file//dir/path}:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt


利用 ${ } 還可針對不同的變數狀態賦值(沒設定、空值、非空值):

${file-my.file.txt} : 假如 $file 沒有設定,則使用 my.file.txt 作傳回值。(空值及非空值時不作處理)
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作處理)
${file+my.file.txt} : 假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作處理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作處理)
${file=my.file.txt} : 若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。
(空值及非空值時不作處理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。
(非空值時不作處理)
${file?my.file.txt} : 若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作處理)
${file:?my.file.txt} :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 STDERR。 (非空值時不作處理)


  评论这张
 
阅读(57)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017