커맨드 라인에서 다음을 수행했습니다.
$ text="name with space"
$ echo $text
name with space
tr -d ' '
공백을 제거하고 다음과 같은 결과를 얻는 데 사용하려고합니다 .
namewithspace
나는 다음과 같은 몇 가지를 시도했다.
text=echo $text | tr -d ' '
지금까지 행운이 없기를 바랍니다. 훌륭한 사람들이 도울 수 있습니다!
커맨드 라인에서 다음을 수행했습니다.
$ text="name with space"
$ echo $text
name with space
tr -d ' '
공백을 제거하고 다음과 같은 결과를 얻는 데 사용하려고합니다 .
namewithspace
나는 다음과 같은 몇 가지를 시도했다.
text=echo $text | tr -d ' '
지금까지 행운이 없기를 바랍니다. 훌륭한 사람들이 도울 수 있습니다!
답변:
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
전혀 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 배 이상 빠릅니다.
아래와 같이 텍스트 변수를 수정하십시오.
text=$(echo $text | tr -d ' ')
그러나 제어 문자가 있으면 작동하지 않을 수 있습니다. 따라서 카스 퍼스의 제안에 따라 큰 따옴표를 사용할 수 있습니다. 그래서,
text="$(echo "$text" | tr -d ' ')"
더 나은 버전이 될 것입니다.
$text
쉘에 의해 해석되는 제어 문자 가 포함되어 있으면 중단됩니다 . 이중 인용 부호를 더 잘 넣는 것이 text="$(echo "$text" | tr -d ' ')"