하이픈이 포함된 문자열의 모든 인스턴스 바꾸기

하이픈이 포함된 문자열의 모든 인스턴스 바꾸기

다음 명령을 실행하십시오.

echo "hello-world" | tr "hello-world" "Hello World"

반품 Heddd-ddddd. 나는 그것을 돌려받고 싶다 Hello World. 나는 이것이 tr매개변수가 맨페이지 SET1의 범위로 해석되기 때문이라고 생각합니다.tr

CHAR1-CHAR2
    all characters from CHAR1 to CHAR2 in ascending order

나는 또한 다음을 시도했습니다.

echo ${"hello-world//hello-world/Hello World"}

반품:

bash: ${"hello-world//hello-world/Hello World"}: bad substitution

이를 수행하기 위해 선호되는 방법은 무엇입니까(문자열의 모든 인스턴스를 다른 문자열로 변환)? 또는 다른 프로그램을 사용합니다 tr.

답변1

우리가 탈출해야 한다는 것뿐이야-

echo "hello-world" | tr "hello\-world" "Hello World"

h다행스럽게도 연결된 결과를 제공하기 위해 컨텍스트에 후행 OR이 없습니다 w. 따라서 각 문자열의 첫 번째 문자를 대문자로 바꾸는 것이 좋습니다.

사용sed

echo "hello-world" | sed 's/-/ /g;s/\<./\U&/g'

답변2

당신은 할 수

  • 하이픈을 다음으로 변환tr
  • 각 단어의 첫 글자를 대문자로 변환하고 각 단어의 나머지 부분을 ($i,2)변환 없이 인쇄합니다.awk

    $ echo 'hello-world-peace' | tr '-' ' ' | \
     awk '{for(i=1;i<=NF;i++){ $i=toupper(substr($i,1,1)) substr($i,2) }} {print}'
    Hello World Peace
    

awk전체 작업 에 사용할 수도 있습니다 .

  • 하이픈을 다음으로 변환gsub
  • 각 단어의 첫 글자를 대문자로 변환toupper
  • ($i,2)변환 없이 각 단어의 나머지 부분을 인쇄합니다.

    echo 'hello-world-peace' | \
     awk '{gsub("-"," "); for(i=1;i<=NF;i++) \
     { $i=toupper(substr($i,1,1)) substr($i,2) }} {print}'
    

답변3

이것은 sed작동합니다:

echo "hello-world" |sed -E -n 's/.(.*)-.(.*)/H\1 W\2/p'

산출:

Hello World

관련 정보