[英]Replace multiple underscores in filename using bash script
通常,將原始代碼放入循環中會比執行其他任何操作更快。
for file in *; do
f=$file
while [[ $f = *__* ]]; do
f=${f//__/_}
done
echo "$f"
done
更好的是,如果您使用的是現代 shell 版本,您可以啟用擴展 glob,它提供了類似正則表達式的功能:
shopt -s extglob
for file in *; do
f=${file//+(_)/_}
echo "$f"
done
您可以使用sed
使用簡單的正則表達式
for file in *; do
f=$(echo $file | sed -e 's/_\+/_/')
echo $f
done;
GNU tr
有--squeeze-repeats
:
$ echo foo_______bar | tr --squeeze-repeats _
foo_bar
如果您使用的是 BSD tr
,則可以使用-s
代替:
$ echo foo_______bar | tr -s _
foo_bar
此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 '%s\n' "$file"
代替echo "$file"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.