sedまたはtr(bash)を使用せずに、特定のLinuxファイル名の複数のスペースを圧縮します。

sedまたはtr(bash)を使用せずに、特定のLinuxファイル名の複数のスペースを圧縮します。

以下を実行する関数を作成する必要があります。関数は次の形式のファイル名を受け取ります。*.station

単語間に複数のスペースがある可能性があるため、単語間に余分なスペースを削除して1つだけ残したいと思います。

たとえば、(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}"

関連情報