쉘 변수에서 공백을 어떻게 제거합니까?


15

커맨드 라인에서 다음을 수행했습니다.

$ text="name with space"
$ echo $text
name with space

tr -d ' '공백을 제거하고 다음과 같은 결과를 얻는 데 사용하려고합니다 .

namewithspace

나는 다음과 같은 몇 가지를 시도했다.

text=echo $text | tr -d ' '

지금까지 행운이 없기를 바랍니다. 훌륭한 사람들이 도울 수 있습니다!

답변:


45

Bash에서는 Bash의 내장 문자열 조작을 사용할 수 있습니다. 이 경우 다음을 수행 할 수 있습니다.

> text="some text with spaces"
> echo "${text// /}"
sometextwithspaces

문자열 조작 연산자에 대한 자세한 내용은 http://tldp.org/LDP/abs/html/string-manipulation.html을 참조하십시오.

그러나 원래 전략도 효과가 있으며 구문은 약간 벗어납니다.

> text2=$(echo $text | tr -d ' ')
> echo $text2
sometextwithspaces

나는 그것을 생각조차하지 않았다. 좋은 답변!
user3347022

11

전혀 echo명령이 필요하지 않으며 대신 Here String을 사용하십시오.

text=$(tr -d ' ' <<< "$text")

호기심을 위해서 나는 그런 사소한 작업이 다른 도구에 걸리는 시간을 확인했습니다. 가장 느린 것부터 가장 빠른 것까지 정렬 된 결과는 다음과 같습니다.

abc="some text with spaces"

$ time (for i in {1..1000}; do def=$(echo $abc | tr -d ' '); done)
0.76s user 1.85s system 52% cpu 4.976 total

$ time (for i in {1..1000}; do def=$(awk 'gsub(" ","")' <<< $abc); done)
1.09s user 2.69s system 88% cpu 4.255 total

$ time (for i in {1..1000}; do def=$(awk '$1=$1' OFS="" <<< $abc); done)
1.02s user 1.75s system 69% cpu 3.968 total

$ time (for i in {1..1000}; do def=$(sed 's/ //g' <<< $abc); done)
0.85s user 1.95s system 76% cpu 3.678 total

$ time (for i in {1..1000}; do def=$(tr -d ' ' <<< $abc); done)
0.73s user 2.04s system 85% cpu 3.244 total

$ time (for i in {1..1000}; do def=${abc// /}; done)
0.03s user 0.00s system 59% cpu 0.046 total

순수한 쉘 작업은 확실히 가장 빠르지 만, 가장 느린 명령보다 100 배 이상 빠릅니다.


항상 그런 것은 아닙니다 stackoverflow.com/q/14967299
Steven Penny

5

아래와 같이 텍스트 변수를 수정하십시오.

text=$(echo $text | tr -d ' ')

그러나 제어 문자가 있으면 작동하지 않을 수 있습니다. 따라서 카스 퍼스의 제안에 따라 큰 따옴표를 사용할 수 있습니다. 그래서,

text="$(echo "$text" | tr -d ' ')"

더 나은 버전이 될 것입니다.


훌륭한! 나는 soooo가 가까웠다. 멍청한 놈으로서 나는 올바른 방향으로 가고 있다는 것을 기쁘게 생각합니다! 빠른 응답도 감사합니다. 8 분을 기다리 자마자이를 답변으로 제출하겠습니다!
user3347022

@ user3347022, 천만에 :)
Ramesh

1
$text쉘에 의해 해석되는 제어 문자 가 포함되어 있으면 중단됩니다 . 이중 인용 부호를 더 잘 넣는 것이 text="$(echo "$text" | tr -d ' ')"
좋습니다

@kasperd, 언급 해 주셔서 감사합니다. 나는 당신의 제안을 통합했습니다.
Ramesh


2

숫자가있는 변수가 필요한 특별한 경우 :

sh :

typeset -i A=B #or
typeset -i A="   23232"

ksh :

typeset -n A=B #or
typeset -n A="   23232"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.