,以提取_前面和後面的數字我有文件名格式如下:filename_1234.svg
擊:如何通過
我如何可以檢索下劃線前面和後面點的數量。有可能是前.svg
我已經試過一到四個數字之間:
width=${fileName//[^0-9]/}
,但如果文件名中包含了一些爲好,它會在文件名,例如返回所有號碼
file6name_1234.svg
我找到了解決方案,爲兩個下劃線(它分成數組),但是我正在尋找一種方法來檢查下劃線以及點。
,以提取_前面和後面的數字我有文件名格式如下:filename_1234.svg
擊:如何通過
我如何可以檢索下劃線前面和後面點的數量。有可能是前.svg
我已經試過一到四個數字之間:
width=${fileName//[^0-9]/}
,但如果文件名中包含了一些爲好,它會在文件名,例如返回所有號碼
file6name_1234.svg
我找到了解決方案,爲兩個下劃線(它分成數組),但是我正在尋找一種方法來檢查下劃線以及點。
您可以使用簡單的參數擴展與子去除簡單地從權達,幷包括了'.'
修剪,然後從修剪留直到並且包括該'_'
,留下你想要的號碼,例如
$ 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
上操作即可。使用殼能力等參數擴展防止創建一個單獨子外殼和產卵,使用像sed
,grep
或awk
(或任何一個實用程序,不是外殼的一部分時,會發生一個獨立的進程:
說明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
:含有陣列捕獲的組我會用
sed 's!_! !g' | awk '{print "_" $NF}'
從filename_1234.svg去_1234 .svg then
sed 's!svg!!g'
擺脫擴展名。
一些更多的方式
[[email protected] tmp]$ filename=file1b2aname_1234.svg
[[email protected] tmp]$ after=${filename##*_}
[[email protected] tmp]$ echo ${after//[^0-9]}
1234
使用awk
[[email protected] tmp]$ awk -F'[_.]' '{print $2}' <<< "$filename"
1234
如果設置IFS
,你可以使用bash的內建read
。
這將按下劃線和點分割文件名,並將結果存儲在數組a
中。
IFS='_.' read -a a <<<'file1b2aname_1234.svg'
而這將從數組中倒數第二個元素。
echo ${a[-2]}
有一個解決方案使用剪切:
name="file6name_1234.svg"
num=$(echo "$name" | cut -d '_' -f 2 | cut -d '.' -f 1)
echo "$num"
-d
是指定的分隔符。
-f
指的是所需的字段。
我對性能一無所知,但理解起來很簡單,維護也很簡單。
如果我運行此代碼,我會得到:e_1和e。另外,如果文件名包含另一個下劃線,可以說:file6_name_1234.svg它輸出:6_n和6(即使它不適合該模式:下劃線數字點 - >提取數字)任何幫助表示讚賞。 – TheRed
@TheRed修改了正則表達式以解決您的問題 – Aserre