在不使用 sed 或 tr (bash) 的情况下压缩给定 Linux 文件名中的多个空格

在不使用 sed 或 tr (bash) 的情况下压缩给定 Linux 文件名中的多个空格

我需要编写一个执行以下操作的函数:该函数接收具有此格式的文件名*.station

单词之间可能有多个空格,我想删除单词之间多余的空格,只留下一个。

例如(1): aa__________a____aa _____________ ssd________.station,需要改为aa_a_aa_ssd.station

(2):aa______________a.station需要写成:aa_a.station

_(上面的下划线( )表示空格。)

答案1

shopt -s extglob
file="aa     a       a.station"
echo mv "$file" "${file// +( )/ }"

另一种选择是循环

"${file//  / }"

直到只剩下一个空格:

file="a                      a"

last_run=""
new="$file"
while [ "$last_run" != "$new" ]; do
        last_run="$new"
        new="${last_run//  / }"
done

echo mv "$file" "$new"

或者使用分词:

IFS=" "
mv "$file" "$(echo $file)"

答案2

#!/bin/bash
file="aa     a       a.station"
read -r -a myarray <<< "$file"
printf  "${myarray[*]}"

这会将字符串读入数组,并按标准 IFS 字符(空格、制表符、换行符)进行分割。然后打印整个数组,每个元素现在带有单个分隔符。

您还可以利用xargs

#!/bin/bash
file="aa     a       a.station"
newfile=$(echo $file|xargs)
printf  "${newfile}"

相关内容