bash를 사용하여 각 밑줄 구분 기호의 첫 문자를 얻는 방법

bash를 사용하여 각 밑줄 구분 기호의 첫 문자를 얻는 방법

안녕하세요. 팀에서 테이블 이름이 다음과 같은 상황에 처해 있습니다.

head_must_report

customer_report_sub_division

country_code_universe_nation_part

그러나 cut 명령을 사용하면 출력은 다음과 같아야 합니다. 참고: 테이블 이름은 밑줄로 구분됩니다.

HMR

CRSD

CCUNP

Bash 스크립트 사용

답변1

Perl이 없으면 sed다음을 사용하세요 tr.

> sed 's/\(.\)[^_]*_*/\1/g' /tmp/data | tr 'a-z' 'A-Z'
HMR

CRSD

CCUNP

답변2

perl -ple 's/(?:^|_)(.)[^_]*/\U$1/g'

이 Perl 명령은 표준 입력에서 행을 읽고 질문에서 언급한 규칙에 따라 변환합니다. s///문자열 시작 부분이나 밑줄 문자 바로 뒤에 나타나는 모든 문자를 추출하고 대문자로 바꾸는 바꾸기 명령( )을 사용하여 이 작업을 수행합니다 . 위의 변형이 일치합니다.어느(.)하지만 소문자만 일치 하도록 변경하여 ([a-z])이를 제한 할 수도 있습니다 .

예:

$ echo yeah_seem_to_work | perl -ple 's/(?:^|_)(.)[^_]*/\U$1/g'
YSTW

답변3

perl정규식을 사용하지 않고:

perl -lne 'print map {/./;uc $&} split /_/' test

Gnu sed 사용 \u:

sed 's/_*\(.\)[^_]*/\u\1/g' test

Posix sed:

sed 's/_*\(.\)[^_]*/\1/g;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' test

Posix awk( Gnu awk, 및 으로 mawk테스트됨 busybox awk):

awk -F_ -v OFS="" '{for(i=1; i<=NF; i++) $i = toupper(substr($i, 1, 1))}1' test 

python(2 또는 3):

python -c '
import sys
print("".join([k[0].capitalize() for k in sys.argv[1].split("_")]))
' string

답변4

눈송이 때문에 그래

regexp_replace(table_name, '\(.\)\([^_]*_*\)', '\\1') 

관련 정보