tr -s를 사용하여 공백을 제거할 수 없는 이유는 무엇입니까?

tr -s를 사용하여 공백을 제거할 수 없는 이유는 무엇입니까?

다음을 입력하면

echo "This   is   for    testing" | tr -s [:space:]

나는 이것을 이해한다 ...

This   is   for    testing

여러 공백을 제거하고 단어 사이에 공백 하나만 넣기를 바랐습니다. 내가 뭘 잘못하고 있는지 알 수 없습니다.

답변1

에서 tr -s [:space:]인용되지 않은 항목은 [:space:]쉘에 의해 glob으로 처리되며, 해당 glob(단일 문자로 된 파일 이름 :, a, c, , e, p, s)과 일치하는 파일이 있으면 쉘(예: bash)이 이를 확장합니다. 해당 파일 이름에 대한 glob:

bash-5.1$ echo tr -s [:space:]
tr -s [:space:]
bash-5.1$ touch c
bash-5.1$ echo tr -s [:space:]
tr -s c

(쉘 옵션에 따라 다른 작업을 수행할 수도 있습니다.)

따라서 쉘이 해석하지 않도록 인용을 사용하십시오 [:space:].

echo "This   is   for    testing" | tr -s '[:space:]'

답변2

그것은 공백을 압축하는 데 효과적이지만 샘플 텍스트의 공백은 실제로 공백이 아니기 때문에 작동하지 않을 수도 있습니다.

탭일 수도 있습니다.

이 시도

echo "This   is   for   testing" | tr \\t " "

또는 탭이 여러 개인 경우 다음을 사용해 볼 수 있습니다.

echo "This  is   for   testing" | tr \\t " " | tr -s [:space:]

관련 정보