我正在嘗試重命名模式 A_B_x.csv 中的檔案,其中 x 在 (1..10) 中,我想要的是完全擁有 A_B_x 10.csv,例如,如果檔案是 A_B_1.csv 我想要有 A_B_11.csv。我對 bash 很陌生,還沒有找到解決方案,我試過:
for f in *.csv;
do
newname=`echo $f | sed 's/1.csv/11.csv/g'`;
mv $f $newname;
done
用 11 替換所有 1,但我不確定如何概括它,因此它適用于所有數字。有人有想法嗎?
uj5u.com熱心網友回復:
請您嘗試以下操作:
for f in *.csv; do
num=$(( ${f//[^0-9]} 10 ))
mv "$f" "$(sed -E 's/([^0-9] )[0-9] (. )/\1'"$num"'\2/' <<< "$f")"
done
${f//[^0-9]}從變數中提取數字$fnum=$(( ${f//[^0-9]} 10 ))將 num 分配給數字 10。- "$(sed -E 's/([^0-9] )[0-9] (. )/\1'"$num"'\2/' <<< "$f")"回傳數字替換的檔案名
$num。
【備選】
如果有perlrename命令,也可以說:
rename 's/(\d )/$& 10/e' *.csv
請注意有兩個不同的rename命令。
uj5u.com熱心網友回復:
你不需要sed這個(但你當然可以使用它)。只用 bash:
pre="${f%_*}"
tmp="${f##*_}"
num="${tmp%.csv}"
new="${pre}_$((num 10)).csv"
uj5u.com熱心網友回復:
您可以使用 bash 內置的Parameter Expansions非常簡單地做到這一點。您首先從檔案名中修剪擴展名fn="${j%.csv}"。將不帶數字的基本檔案名另存為base="${j%_*}". 用 保存擴展名ext="${j##*.}",最后用num="${fn##*_}"
現在,只需添加10到號碼,num=$((num 10))并把檔案名一起回來,new="${base}_${num}.${ext}"然后移動j到new。
你可以這樣做:
for j in A_B*; do
fn="${j%.csv}" ## filename w/o extension
base="${j%_*}" ## base filename w/o number
ext="${j##*.}" ## save extension
num="${fn##*_}" ## isolate number
num=$((num 10)) ## add 10 to number
new="${base}_${num}.${ext}" ## reconstitute filename w/new number
echo "$j -> $new" ## output result
# mv "$j" "$new" ## **Uncomment** to actually perform the move
done
Bash 提供了許多有用的引數擴展,與從字串的前面(開始)和后面(結束)修剪相關的集合是:
${var#pattern} Strip shortest match of pattern from front of $var
${var##pattern} Strip longest match of pattern from front of $var
${var%pattern} Strip shortest match of pattern from back of $var
${var%%pattern} Strip longest match of pattern from back of $var
(注意:模式可以包含正常的通配符,例如'*')
示例使用/輸出
如果你有檔案名A_B_1.csv到A_B_5.csv當前目錄,結果將是:
A_B_11.csv
A_B_12.csv
A_B_13.csv
A_B_14.csv
A_B_15.csv
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/334795.html
標籤:猛击
上一篇:從網站源代碼中提取兩個值
