在sed或awk中大写字符串

时间:2012-08-03 21:14:58

标签: bash sed awk

我有三种类型的字符串,我想在bash脚本中大写。我认为sed / awk是我最好的选择,但我不确定。考虑到以下要求,最好的方法是什么?

  1. 单词
     例如taco -> Taco

  2. 用连字符分隔的多个单词
     例如my-fish-tacos -> My-Fish-Tacos

  3. 由下划线分隔的多个单词
     例如my_fish_tacos -> My_Fish_Tacos

6 个答案:

答案 0 :(得分:29)

没有必要使用捕获组(虽然&在某种程度上是一个):

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

输出:

Taco My-Fish-Tacos My_Fish_Tacos

转义的小写字母“u”将匹配的子字符串中的下一个字符大写。

答案 1 :(得分:7)

使用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);
     }
}'

答案 2 :(得分:6)

尝试以下方法:

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

使用GNU sed对我有用,但我不认为BSD sed支持\U\L

答案 3 :(得分:3)

这是一个不使用\u的解决方案,这对所有seds都不常见。

将此文件保存到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
}

答案 4 :(得分:1)

这可能适合你(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

答案 5 :(得分:1)

alinsoar的令人兴奋的解决方案在Plan9 sed中根本不起作用,或者在busybox 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