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}"

관련 정보