20

bash スクリプトで大文字にしたい 3 種類の文字列があります。sed/awk が最善の策だと思いましたが、よくわかりません。次の要件を考えると、最善の方法は何ですか?

  1. 単語
    taco -> Taco

  2. ハイフンで区切られた複数の単語
    など my-fish-tacos -> My-Fish-Tacos

  3. アンダースコアで区切られた複数の単語
    など my_fish_tacos -> My_Fish_Tacos

4

6 に答える 6

32

キャプチャ グループを使用する必要はありません (ただし&、ある意味では 1 つです)。

echo "taco my-fish-tacos my_fish_tacos" | sed 's/[^ _-]*/\u&/g'

出力:

Taco My-Fish-Tacos My_Fish_Tacos

エスケープされた小文字「u」は、一致した部分文字列の次の文字を大文字にします。

于 2012-08-03T21:36:55.550 に答える
8

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);
     }
}'
于 2012-08-03T21:33:40.133 に答える
6

次のことを試してください。

sed 's/\([a-z]\)\([a-z]*\)/\U\1\L\2/g'

\UGNU sed を使用して動作しますが、BSD sed はand をサポートしていないと思います\L

于 2012-08-03T21:23:28.953 に答える
3

\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
}
于 2012-08-03T23:41:34.850 に答える
1

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
于 2014-02-06T17:32:37.030 に答える
0

これはうまくいくかもしれません(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
于 2012-08-04T07:05:52.790 に答える