Bash에서 한 문자를 다른 문자로 교체


223

bash의 문자열에서 공백 ( )을 점 ( .)으로 바꾸는 것이 가능해야합니다 .

나는 이것이 매우 간단하다고 생각하지만, 새로운 용도 이므로이 사용을 위해 비슷한 예제를 수정하는 방법을 알 수 없습니다.

답변:


390

인라인 쉘 문자열 교체를 사용하십시오. 예:

foo="  "

# replace first blank only
bar=${foo/ /.}

# replace all blanks
bar=${foo// /.}

자세한 내용은 http://tldp.org/LDP/abs/html/string-manipulation.html 을 참조하십시오.


1
이 솔루션은 짧은 문자열 (일반적인 경우)을 다룰 때 유용하지만 tr긴 문자열을 선호 할 수 있습니다. 내 시스템 tr에서 1000문자 보다 많은 문자열에서 시작하는 bash보다 성능이 우수 합니다. bash의 시간 복잡성이 선형보다 나빠 보입니다. 작은 시험 : x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}". 1M의 문자열 길이 (20 ^ 2 =) tr했다 0.04s배시 5.0.11이 걸렸다 17s. 2M가 함께 tr했다 0.07s(예상)하지만 배쉬했다 69s(2 회 문자열 길이만큼 4 번).
Socowi

@Socowi 변수에 저장된 1Mb로 재생하는 것은 실제로 일반적이지 않습니다! 개까지 더 10KB보다 배쉬가 분기보다 빨리 머물 것 같다 tr할 수있는 작업의 종류에 따라 당신이 맞아요을! :! ... 사용 가능한 메모리 및 하드웨어 자원에 따라 ...하지만, 전용 도구를보다 효율적으로있어!
F. Hauri

줄 바꿈과 같은 이스케이프 문자의 경우$'\n'
user2561747

75

다음 tr과 같이 사용할 수 있습니다 .

tr " " .

예:

# echo "hello world" | tr " " .
hello.world

보낸 사람 man tr:

설명
     표준 입력에서 표준 출력으로 문자를 번역, 압착 및 / 또는 삭제합니다.


이것은 질문에 따라 작동하지만 문자 대체 및 임의의 문자열에서 작동하는 허용 된 답변보다 덜 일반적이며 외부 명령과 관련이 있습니다.
Dan Dascalescu

2
반면에 그것은 전체를 메모리에로드하지 않고 2GB 파일에서 작동합니다.
aioobe

문제는 임의로 큰 파일이 아니라 "bash의 문자열"에 관한 것이 었습니다.
Dan Dascalescu

52

bash에서는 구문 으로 문자열에서 패턴 교체 를 수행 할 수 있습니다 ${VARIABLE//PATTERN/REPLACEMENT}. 첫 번째 항목 만 바꾸지 /말고 그대로 사용하십시오 //. 패턴은 파일 글로브와 같은 와일드 카드 패턴입니다.

string='foo bar qux'
one="${string/ /.}"     # sets one to 'foo.bar qux'
all="${string// /.}"    # sets all to 'foo.bar.qux'

24

이 시도

 echo "hello world" | sed 's/ /./g' 


4

경로를 위해 이것을 시도하십시오 :

echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'

큰 따옴표로 묶인 문자열 내부의 공백을 +노래로 바꾼 다음+ 부호를 백 슬래시로 바꾼 다음 큰 따옴표를 제거 / 바꾸십시오.

Cygwin의 경로 중 하나의 공백을 대체하기 위해 이것을 사용해야했습니다.

echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'

2
의 문제를 해결하는 2 년 된 답변이 이미 있습니다 sed. 인용문은 관련이 없습니다.
chepner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.