2012-08-03 75 views
15

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

1.)单个词 例如, taco -> Taco

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

3.)用下划线分隔的多个词 例如, my_fish_tacos -> My_Fish_Tacos

回答

26

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

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

输出:

Taco My-Fish-Tacos My_Fish_Tacos 

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

+0

我该如何修改它以处理全部大写的单词?例如my-FISH-TACOS应输出My-Fish-Tacos – GregB 2012-08-06 06:09:06

+4

@GregB:告诉它将所有字符小写,然后小写所有字符: 'sed's/[^ _-] */\ L \ u&/ g'' – 2012-08-06 10:32:13

+2

注意:这是一个GNU sed扩展。BSD sed用户(包括OS X)无法做到这一点。 – Jashank 2014-03-03 03:56:55

6

尝试以下操作:

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

它使用GNU sed的工作对我来说,但我不认为BSD sed的支持\U\L

6

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

解释关于上面的例子有点: ** ** NF - 内置AWK变量来自字段数(通常表明你有多少个空格分隔字符串有一个行) - 在这个例子中它会返回1 ** substr ** - 返回substring,声明看起来像这样** substr(string,start,length)**。 ** sub ** - 替代函数 - ** sub(正则表达式,替换,目标)** – 2016-01-12 00:47:00

+1

注意:使用toupper(substr(...'而不是'substr(toupper() '。 – 2016-04-14 17:15:20

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 
} 
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 
0

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