2015-11-06 72 views
1

我有名稱爲「words_transfer1_morewords.txt」的文件。我希望確保「傳輸」之後的數字是五位數字,如「words_transfer00001_morewords.txt」中所示。我將如何使用ksh腳本來做到這一點?謝謝。shell腳本在文件名中間添加前導零

回答

2

這將在任何Bourne類型/ POSIX殼工作,只要你morewords不包含數字:

file=words_transfer1_morewords.txt 
prefix=${file%%[0-9]*} # words_transfer 
suffix=${file##*[0-9]} # _morewords.txt 
num=${file#$prefix}  # 1_morewords.txt 
num=${num%$suffix}  # 1 
file=$(printf "%s%05d%s" "$prefix" "$num" "$suffix") 
echo "$file" 
+0

嗯..你確定參數擴展/子串提取是POSIX? Bash - 是的,Bourne - ?? –

+0

'%'和'#'都是POSIX(這與它們是否在Bourne中是正交的)。 'bash'擴展將使用'num = $ {file /%[0-9] *}'在一個操作中匹配和刪除前綴。 – chepner

+0

@ DavidC.Rankin是的,我確定。 POSIX在這裏定義它:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02我與The Opengroup合作:-) – Jens

0

使用ksh的正則表達式匹配操作,打破文件名分成不同的部分,格式化數字後又將它們重新組合在一起。

pre="[^[:digit:]]+" # What to match before the number 
num="[[:digit:]]+" # The number to match 
post=".*"   # What to match after the number 

[[ $file =~ ($pre)($num)($post) ]] 
new_file=$(printf "%s%05d%s\n" "${.sh.match[@]:1:3}") 

在成功匹配=~,特殊的陣列參數.sh.match包含元素0的全場比賽,並以起始元素中的每個捕獲組1

相關問題