sed: 마침표가 발견될 때까지 _의 모든 항목을 교체합니다.

sed: 마침표가 발견될 때까지 _의 모든 항목을 교체합니다.

입력 예:

test_replace.test_json

예상 출력:

test-replace

현재 코드:

sed -e 's/_/-/g'

현재 출력:

test-replace.test-json

어떤 도움이라도 대단히 감사하겠습니다! !

답변1

나는 두 단계를 사용합니다: 1) 첫 번째 점과 그 뒤의 모든 점을 제거합니다. 2) 나머지 밑줄을 바꿉니다.

sed 's/\..*//; s/_/-/g'

답변2

문자열이 쉘 변수에 있다고 가정 하고 또는 쉘을 name사용한다고 가정합니다 .bashzsh

name=${name%.*}    # remove everything after the last dot
name=${name//_/-}  # change all underscores to dashes

위의 첫 번째 할당으로 제거된 확장을 유지하시겠습니까?

ext=${name##*.}    # remove everything up to the last dot
name=${name%.*}    # remove everything after the last dot
name=${name//_/-}  # change all underscores to dashes
name=$name.$ext    # re-attach extension

또는 다른 순서로 작업을 수행하여 시간을 조금 단축하세요.

ext=${name##*.}        # remove everything up to the last dot
name=${name//_/-}      # change all underscores to dashes
name=${name%.*}.$ext   # remove (possibly modified) extension and attach original extension

${variable%pattern}(가장 짧은 일치 접미사 제거) 및 ${variable##pattern}(가장 긴 일치 접두사 제거)는 모두 표준 변수 확장입니다. ( ${variable//pattern/replacement}모든 발생을 ) 셸(및 적어도 셸)에서 지원하는 확장으로 바꿉니다.patternreplacementbashzsh

관련 정보