在這里和這里做一些閱讀,我發現這個解決方案使用 bash 將檔案名中的兩個下劃線替換為一個:
for file in *; do
f=${file//__/_}
echo $f
done;
但是,我如何最輕松地擴展此運算式以僅用一個下劃線替換任意數量的下劃線?
uj5u.com熱心網友回復:
通常,將原始代碼放入回圈中比做其他任何事情都要快。
for file in *; do
f=$file
while [[ $f = *__* ]]; do
f=${f//__/_}
done
echo "$f"
done
更好的是,如果您使用的是現代 shell 版本,您可以啟用擴展的 globs,它提供類似正則運算式的功能:
shopt -s extglob
for file in *; do
f=${file// (_)/_}
echo "$f"
done
uj5u.com熱心網友回復:
你可以使用一個簡單的正則運算式 sed
for file in *; do
f=$(echo "$file" | sed -e 's/_\ /_/')
echo "$f"
done;
此正則運算式匹配一個或多個下劃線 ( _\ ) 并僅用一個 ( _)替換它們
uj5u.com熱心網友回復:
GNUtr有--squeeze-repeats:
$ echo foo_______bar | tr --squeeze-repeats _
foo_bar
如果您使用的是 BSD tr,則可以-s改用:
$ echo foo_______bar | tr -s _
foo_bar
uj5u.com熱心網友回復:
此Shellcheck -clean 純 shell 代碼應適用于任何符合 POSIX 標準的 shell,包括bash和dash:
for file in *; do
while :; do
case $file in
*__*) file=${file%%__*}_${file#*__};;
*) break;;
esac
done
printf '%s\n' "$file"
done
${file%%__*}擴展為洗掉后$file的第一個__和所有字符(例如a__b__c產生a)。${file#*__}擴展到$file所有字符,包括第一個__被洗掉的字符(例如a__b__c產生b__c)。- 請參閱為什么 printf 比 echo 好?用于解釋為什么
printf '%s\n' "$file"使用而不是echo "$file".
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372728.html
上一篇:搜索并替換一個csv檔案
