2017-07-25 38 views
3

,以提取_前面和後面的數字我有文件名格式如下:filename_1234.svg擊:如何通過

我如何可以檢索下劃線前面和後面點的數量。有可能是前.svg

我已經試過一到四個數字之間:

width=${fileName//[^0-9]/} 

,但如果文件名中包含了一些爲好,它會在文件名,例如返回所有號碼

file6name_1234.svg 

我找到了解決方案,爲兩個下劃線(它分成數組),但是我正在尋找一種方法來檢查下劃線以及點。

回答

1

您可以使用簡單的參數擴展與子去除簡單地從達,幷包括了'.'修剪,然後從修剪留直到並且包括該'_' ,留下你想要的號碼,例如

$ width=filename_1234.svg; val="${width%.*}"; val="${val##*_}"; echo $val 
1234 

注:從#微調留下首次出現##微調至最後發生%%%的工作方式與相同

解釋:

  • width=filename_1234.svg - width握着你的文件名

  • val="${width%.*}" - val持有filename_1234

  • val="${val##*_}" - 最後val持有1234

當然,如果您的意圖是width應該保持寬度,則不需要使用像val這樣的臨時值。我只是用一個溫度來防止改變width的原始內容。如果您想要width中的結果數字,只需將val替換爲width,然後直接在width上操作即可。使用殼能力等參數擴展防止創建一個單獨子外殼和產卵,使用像sedgrepawk(或任何一個實用程序,不是外殼的一部分時,會發生一個獨立的進程:

說明2對於這個問題)。

2

試試下面的代碼:

filename="filename_6_1234.svg" 
if [[ "$filename" =~ ^(.*)_([^.]*)\..*$ ]]; 
then 
    echo "${BASH_REMATCH[0]}" #will display 'filename_6_1234.svg' 
    echo "${BASH_REMATCH[1]}" #will display 'filename_6' 
    echo "${BASH_REMATCH[2]}" #will display '1234' 
fi 

說明:

  • =~:對正則表達式比較
  • ^(.*)_([^.])\..*$ bash的運營商:我們尋找任何字符,後跟一個下劃線,後面是任何字符,後跟一個點和一個擴展名。我們創建了2個捕捉組,一組爲最後底線之前,一個後
  • BASH_REMATCH:含有陣列捕獲的組
+0

如果我運行此代碼,我會得到:e_1和e。另外,如果文件名包含另一個下劃線,可以說:file6_name_1234.svg它輸出:6_n和6(即使它不適合該模式:下劃線數字點 - >提取數字)任何幫助表示讚賞。 – TheRed

+1

@TheRed修改了正則表達式以解決您的問題 – Aserre

0

我會用

sed 's!_! !g' | awk '{print "_" $NF}' 

從filename_1234.svg去_1234 .svg then

sed 's!svg!!g' 

擺脫擴展名。

0

如果設置IFS,你可以使用bash的內建read

這將按下劃線和點分割文件名,並將結果存儲在數組a中。

IFS='_.' read -a a <<<'file1b2aname_1234.svg' 

而這將從數組中倒數第二個元素。

echo ${a[-2]} 
0

有一個解決方案使用剪切:

name="file6name_1234.svg" 
num=$(echo "$name" | cut -d '_' -f 2 | cut -d '.' -f 1) 
echo "$num" 

-d是指定的分隔符。

-f指的是所需的字段。

我對性能一無所知,但理解起來很簡單,維護也很簡單。