![sed 또는 tr(bash)을 사용하지 않고 특정 Linux 파일 이름의 여러 공백을 압축합니다.](https://linux55.com/image/116607/sed%20%EB%98%90%EB%8A%94%20tr(bash)%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%ED%8A%B9%EC%A0%95%20Linux%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%98%20%EC%97%AC%EB%9F%AC%20%EA%B3%B5%EB%B0%B1%EC%9D%84%20%EC%95%95%EC%B6%95%ED%95%A9%EB%8B%88%EB%8B%A4..png)
다음을 수행하는 함수를 작성해야 합니다. 함수는 다음 형식의 파일 이름을 받습니다.*.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}"