
次のように入力すると
echo "This is for testing" | tr -s [:space:]
分かりました…
This is for testing
複数のスペースを削除して、単語間のスペースを 1 つだけにしたいのですが、何が間違っているのかわかりません。
答え1
ではtr -s [:space:]
、引用符で囲まれていない部分は[:space:]
シェルによってグロブとして扱われ、そのグロブ(、、、、、、のいずれか 1 文字を含むファイル名)に一致するファイルがある場合、シェル:
(おそらく bash)はそのグロブをそのファイル名に展開します。a
c
e
p
s
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:]