tr -s を使用してスペースを削除できないのはなぜですか

tr -s を使用してスペースを削除できないのはなぜですか

次のように入力すると

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

分かりました…

This   is   for    testing

複数のスペースを削除して、単語間のスペースを 1 つだけにしたいのですが、何が間違っているのかわかりません。

答え1

ではtr -s [:space:]、引用符で囲まれていない部分は[:space:]シェルによってグロブとして扱われ、そのグロブ(、、、、、、のいずれか 1 文字を含むファイル名)に一致するファイルがある場合、シェル:(おそらく bash)はそのグロブをそのファイル名に展開します。aceps

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:]

関連情報