使用Sed来大写每个单词的第一个字母

时间:2014-09-21 19:17:10

标签: regex bash unix sed

以下是我想要大写的数据:

molly w. bolt     334-78-5443
walter q. bugg    984-49-0032
noah p. way       887-12-0921
kerry t. bricks   431-09-1239
ping h. yu        109-32-9845

这是我到目前为止编写的脚本,用于将名字的第一个字母大写,包括初始

h
s/\(.\).*/\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/\(.\)\n\(.\)\(.*\)/\1\3/
/ [a-z]/{
h
s/\([A-Z][a-z]* \)\([a-z]\).*/\2/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/\(.\)\n\([A-Z][a-z]* \)\(.\)\(.*\)/\2\1\4/
}
/ [a-z]/{
h
s/\([A-Z][a-z]* \)\([a-z]\).*/\2/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/\(.\)\n\([A-Z][a-z]* \)\(.\)\(.*\)/\2\1\4/
}

它给了我:

MOLLY W. BOLT     334-78-544Molly 3. bolt     334-78-5443
WALTER Q. BUGG    984-49-003Walter 2. bugg    984-49-0032
NOAH P. WAY       887-12-092Noah 1. way       887-12-0921
KERRY T. BRICKS   431-09-123Kerry 9. bricks   431-09-1239
PING H. YU        109-32-984Ping 5. yu        109-32-9845

我想只有:

Molly W. Bolt     334-78-544
Walter Q. Bugg    984-49-003
Noah P. Way       887-12-092
Kerry T. Bricks   431-09-123
Ping H. Yu        109-32-984

我会改变什么?

4 个答案:

答案 0 :(得分:5)

这个怎么样(GNU sed):

$ sed 's/\b[a-z]/\u&/g' myfile
Molly W. Bolt     334-78-5443
Walter Q. Bugg    984-49-0032
Noah P. Way       887-12-0921
Kerry T. Bricks   431-09-1239
Ping H. Yu        109-32-9845

答案 1 :(得分:3)

(GNU)Sed什么应该适用于utf8

sed -E 's/[[:alpha:]]+/\u&/g'
#or
sed -E 's/\S+/\u&/g'

或perl

perl -pe 's/(\w+)/\u$1/g'
  • 搜索"字符串" \w+
  • 以大写第一个字符s///替换(替换)$1 \u
  • g
  • 中的任何地方

或更简单的

perl -pe 's/\S+/\u$&/g'
  • 任何非空格字符串
  • 利用

perl -CSDA -pe 's/\S+/\u$&/g'

也适用于utf8个编码文件,例如来自

павел андреевич чехов 234
γεοργε πατσασογλοθ    123
čajka šumivá          345

将打印

Павел Андреевич Чехов 234
Γεοργε Πατσασογλοθ    123
Čajka Šumivá          345

用于内联文件编辑使用下一个:

perl -i.bak -CSDA -pe 's/\S+/\u$&/g' some filenames ....

将创建.bak(备份)文件。

如果你有bash 4.2+并且只需要在变量中进行转换,你可以使用:

for name in павел андреевич чехов γεοργε πατσασογλοθ čajka šumivá
do
    echo "${name^}"   #capitalize the $name
done

打印

Павел
Андреевич
Чехов
Γεοργε
Πατσασογλοθ
Čajka
Šumivá

另外,sed的解决方案,不知道\u https://stackoverflow.com/a/11804643/632407

答案 2 :(得分:2)

使用python也很简单:

$ python -c 'with open("myfile") as f:print f.read().title()'

https://docs.python.org/2/library/stdtypes.html

答案 3 :(得分:1)

sed 's/^/ /;s/ [aA]/ A/g;s/ [bB]/ B/g;s/ [cC]/ C/g;s/ [dD]/ D/g;s/ [eE]/ E/g;s/ [fF]/ F/g;s/ [gG]/ G/g;s/ [hH]/ H/g;s/ [iI]/ I/g;s/ [jJ]/ J/g;s/ [kK]/ K/g;s/ [lL]/ L/g;s/ [mM]/ M/g;s/ [nN]/ N/g;s/ [oO]/ O/g;s/ [pP]/ P/g;s/ [qQ]/ Q/g;s/ [rR]/ R/g;s/ [sS]/ S/g;s/ [tT]/ T/g;s/ [uU]/ U/g;s/ [vV]/ V/g;s/ [wW]/ W/g;s/ [xX]/ X/g;s/ [yY]/ Y/g;s/ [zZ]/ Z/g;s/^.//' YourFile

Posix(无GNU sed)版本 适用于您的样本,但如果{andrea,georges ...假定单词位于行的开头或空格字符后面,则不会。