【问题标题】:Using Sed to capitalize the first letter of each word使用 Sed 将每个单词的首字母大写
【发布时间】:2014-11-15 18:15:46
【问题描述】:

这是我要大写的数据:

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

我会改变什么?

【问题讨论】:

    标签: regex bash unix sed


    【解决方案1】:

    这个怎么样(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
    

    【讨论】:

      【解决方案2】:

      (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+
      • 用大写第一个字符\u替换(替换)s///$1
      • 行中的任何地方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的解决方案,不知道\uhttps://stackoverflow.com/a/11804643/632407

      【讨论】:

      • 在哪里放置 -i 以使这个内联,有趣的 utf8 控制台并没有向我显示应有的结果,将输出定向到新文件工作
      • @josifoski 已编辑...(注意:将 -CS 更改为 -CSDA) - 每个 IO 和参数都是 utf8
      【解决方案3】:

      python 也很简单:

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

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

      【讨论】:

        【解决方案4】:
        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 ... 之类的内容假设单词位于行首或此处的空格字符之后,则无效。

        【讨论】:

          猜你喜欢
          • 2010-12-05
          • 2015-11-10
          • 1970-01-01
          • 1970-01-01
          • 2020-08-30
          • 2015-11-04
          • 2012-11-11
          • 2012-07-24
          • 1970-01-01
          相关资源
          最近更新 更多