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 awkGnu 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') 

関連情報