2011-05-31 237 views
2

讓說我有這個名單:慶典/ SED/AWK:更改第一字母字符串轉換爲大寫

39dd809b7a36 
d83f42ab46a9 
9664e29ac67c 
66cf165f7e32 
51b9394bc3f0 

我想字母爲大寫的第一次出現轉變,例如

39dd809b7a36 - > 39Dd809b7a36

bash/awk/sed解決方案應該沒問題。

感謝您的幫助。

+0

嗨, 我在玩sed regex一段時間後找到了自己的解決方案。 溶液 '的sed的/ \([AZ] \)/ \ U \ 1 /'' 樣品: '的Optimus:〜#回聲「96f795e4370a' '> bfe6f5e05416' '> 5f70a4463d79' '> decab73017db' '> a136f8c01c18' '>「| SED的/ \([A-Z] \)/ \ U \ 1 /''' 96F795e4370a' 'Bfe6f5e05416' '5F70a4463d79' 'Decab73017db' 'A136f8c01c18' 希望人們會發現它是有用的。 其他解決方案也很有趣。 :) – 2011-05-31 03:30:54

+0

我希望這可以在大多數sed版本上運行。驚訝地聽到OSX沒有....:> echo bfe6f5e05416 | sed's/\([a-z] \)/ \ U \ 1 \' result = Bfe6f5e05416 ....:> sed --version result = GNU sed version 4.2.1 – shellter 2011-05-31 03:51:00

+0

yes。我的GNU sed。 optimus:〜#sed --version GNU sed version 4.1.5 這個頁面提到\ U是GNU擴展:[http://www.gnu.org/software/sed/manual/sed.html](http: //www.gnu。org/software/sed/manual/sed.html) – 2011-05-31 03:55:19

回答

1

純擊4.0+使用參數替換:

string=("39dd809b7a36" "d83f42ab46a9" 
     "9664e29ac67c" "66cf165f7e32" "51b9394bc3f0") 

for str in ${string[@]}; do 
    # get the leading digits by removing everything 
    # starting from the first letter: 
    head="${str%%[a-z]*}" 
    # and the rest of the string starting with the first letter 
    tail="${str:${#head}}" 
    # compose result : head + tail with 1. letter to upper case 
    result="$head${tail^}" 

    echo -e "$str\n$result\n" 
done 

結果:

39dd809b7a36 
39Dd809b7a36 

d83f42ab46a9 
D83f42ab46a9 

9664e29ac67c 
9664E29ac67c 

66cf165f7e32 
66Cf165f7e32 

51b9394bc3f0 
51B9394bc3f0 
+0

關注此代碼的工作原理?謝謝。 – 2011-05-31 09:21:58

0

我想不出有什麼巧妙的方法可以用基本的SW工具做到這一點,但BFI解決方案也不是不好。

在一個真正的awk(1)或GAWK:

{ n = split($0, a, "") 
    for(i = 1; i <= n; ++i) { 
    s = a[i] 
    t = toupper(s) 
    if (s != t) { 
     a[i] = t 
     break 
    } 
    } 
    r = "" 
    for(i = 1; i <= n; ++i) { 
    r = r a[i] 
    } 
    print r 
} 

這不是太糟糕的紅寶石:

ruby -p -e '$_ = $_.split(/(?=[a-z])/, 2); $_[1].capitalize!' 
0

這裏是我的解決方案。它不會允許###。###形式的模式,但可以根據需要進行調整。

A = $(貓); B = $(echo $ A | sed's /([az])/ ### \ 1 ### /'| sed's /。###(。)###。/\ 1/'| sed'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ /'); C =「echo $ A | sed's/[a-z]/$ B /'」; EVAL $ C

3

GNU SED能做到這一點

printf "%s\n" 39dd809b7a36 d83f42ab46a9 9664e29ac67c 66cf165f7e32 51b9394bc3f0 | 
sed 's/[[:alpha:]]/\U&/' 

39Dd809b7a36 
D83f42ab46a9 
9664E29ac67c 
66Cf165f7e32 
51B9394bc3f0 
相關問題