bash スクリプトで大文字にしたい 3 種類の文字列があります。sed/awk が最善の策だと思いましたが、よくわかりません。次の要件を考えると、最善の方法は何ですか?
単語
例taco -> Taco
ハイフンで区切られた複数の単語
などmy-fish-tacos -> My-Fish-Tacos
アンダースコアで区切られた複数の単語
などmy_fish_tacos -> My_Fish_Tacos
キャプチャ グループを使用する必要はありません (ただし&
、ある意味では 1 つです)。
echo "taco my-fish-tacos my_fish_tacos" | sed 's/[^ _-]*/\u&/g'
出力:
Taco My-Fish-Tacos My_Fish_Tacos
エスケープされた小文字「u」は、一致した部分文字列の次の文字を大文字にします。
awkの使用:
echo 'test' | awk '{
for ( i=1; i <= NF; i++) {
sub(".", substr(toupper($i), 1,1) , $i);
print $i;
# or
# print substr(toupper($i), 1,1) substr($i, 2);
}
}'
次のことを試してください。
sed 's/\([a-z]\)\([a-z]*\)/\U\1\L\2/g'
\U
GNU sed を使用して動作しますが、BSD sed はand をサポートしていないと思います\L
。
\u
これは、すべての sed に共通ではない、を使用しないソリューションです。
このファイルを に保存してcapitalize.sed
から実行しますsed -i -f capitalize.sed FILE
s:^:.:
h
y/qwertyuiopasdfghjklzxcvbnm/QWERTYUIOPASDFGHJKLZXCVBNM/
G
s:$:\n:
:r
/^.\n.\n/{s:::;p;d}
/^[^[:alpha:]][[:alpha:]]/ {
s:.\(.\)\(.*\):x\2\1:
s:\n\(..\):\nx:
tr
}
/^[[:alpha:]][[:alpha:]]/ {
s:\n.\(.\)\(.*\)$:\nx\2\1:
s:..:x:
tr
}
/^[^\n]/ {
s:^.\(.\)\(.*\)$:.\2\1:
s:\n..:\n.:
tr
}
alinsoar の驚異的なソリューションは、Plan9 sed ではまったく機能せず、busybox sed では正しく機能しません。ただし、sed がどのように機能するのかを理解しようとする必要があります。sed について多くのことを学ぶことができます。
これは、少なくともPlan9、busybox、およびGNU sed(おそらくBSDとMacOS)で動作する、それほど賢くはありませんが理解しやすいバージョンです。Plan9 sed では、コマンドの一致部分でバックスラッシュを削除する必要がありますs
。
#! /bin/sed -f
y/PYFGCRLAOEUIDHTNSQJKXBMWVZ/pyfgcrlaoeuidhtnsqjkxbmwvz/
s/\(^\|[^A-Za-z]\)a/\1A/g
s/\(^\|[^A-Za-z]\)b/\1B/g
s/\(^\|[^A-Za-z]\)c/\1C/g
s/\(^\|[^A-Za-z]\)d/\1D/g
s/\(^\|[^A-Za-z]\)e/\1E/g
s/\(^\|[^A-Za-z]\)f/\1F/g
s/\(^\|[^A-Za-z]\)g/\1G/g
s/\(^\|[^A-Za-z]\)h/\1H/g
s/\(^\|[^A-Za-z]\)i/\1I/g
s/\(^\|[^A-Za-z]\)j/\1J/g
s/\(^\|[^A-Za-z]\)k/\1K/g
s/\(^\|[^A-Za-z]\)l/\1L/g
s/\(^\|[^A-Za-z]\)m/\1M/g
s/\(^\|[^A-Za-z]\)n/\1N/g
s/\(^\|[^A-Za-z]\)o/\1O/g
s/\(^\|[^A-Za-z]\)p/\1P/g
s/\(^\|[^A-Za-z]\)q/\1Q/g
s/\(^\|[^A-Za-z]\)r/\1R/g
s/\(^\|[^A-Za-z]\)s/\1S/g
s/\(^\|[^A-Za-z]\)t/\1T/g
s/\(^\|[^A-Za-z]\)u/\1U/g
s/\(^\|[^A-Za-z]\)v/\1V/g
s/\(^\|[^A-Za-z]\)w/\1W/g
s/\(^\|[^A-Za-z]\)x/\1X/g
s/\(^\|[^A-Za-z]\)y/\1Y/g
s/\(^\|[^A-Za-z]\)z/\1Z/g
これはうまくいくかもしれません(GNU sed):
echo "aaa bbb ccc aaa-bbb-ccc aaa_bbb_ccc aaa-bbb_ccc" | sed 's/\<.\|_./\U&/g'
Aaa Bbb Ccc Aaa-Bbb-Ccc Aaa_Bbb_Ccc Aaa-Bbb_Ccc