【问题标题】:Changing the first letter of every line in a file to uppercase将文件中每一行的第一个字母更改为大写
【发布时间】:2012-04-17 21:14:58
【问题描述】:

我需要将文件中每一行的第一个字母改为大写,例如

the bear ate the fish.
the river was too fast.

会变成:

The bear ate the fish.
The river was too fast.
  • 文档包含一些特殊字母:a、a、á、à、ǎ、ā、b、c、d、e、e、é、è、ě、ē、f、g、h、i、i、 í, ì, ǐ, ī, j, k, l, m, n, o, o, ó, ò, ǒ, ō, p, q, r, s, t, u, u, ú, ù, ǔ, ü、ǘ、ǜ、ǚ、ǖ、ū、v、w、x、y 和 z。
  • 这些字母的大写形式为:A、A、Á、À、Ǎ、Ā、B、C、D、E、E、É、È、Ě、Ē、F、G、H、I、I , Í, Ì, Ǐ, Ī, J, K, L, M, N, O, O, Ó, Ò, Ǒ, Ō, P, Q, R, S, T, U, U, Ú, Ù, Ǔ , Ü, Ǘ, Ǜ, Ǚ, Ǖ, Ū, V, W, X, Y, 和 Z。

如何将文件中每一行的首字母改为大写?

【问题讨论】:

  • 我认为工程师的意思是什么编程语言。 PHP等
  • BASH 将是首选。
  • 问题被标记为“bash”...
  • 抱歉,没有注意到“bash”标签。我删除了我的 PHP 答案。
  • 恐怕没有一个解决方案真正适合你,我只是意识到你的字符集要求是 unicode。这意味着输入文件的格式我们并不知道。

标签: bash case unicode-string


【解决方案1】:

bash:

while read x ; do echo "${x^*}" ; done < inputfile > outputfile

测试/演示(删除done之后的代码以获得更完整的输出):

for f in a, a, á, à, ǎ, ā, b, c, d, e, e, é, è, ě, ē, f, g, h, i, i, í, ì, ǐ, ī, \
         j, k, l, m, n, o, o, ó, ò, ǒ, ō, p, q, r, s, t, \
         u, u, ú, ù, ǔ, ü, ǘ, ǜ, ǚ, ǖ, ū, v, w, x, y, and z.
do  echo "$f foo bar." ; done | 
while read x ; do echo "${x^*}" ; done | head -15 | tail -6

输出:

E, foo bar.
E, foo bar.
É, foo bar.
È, foo bar.
Ě, foo bar.
Ē, foo bar.

【讨论】:

    【解决方案2】:

    要更改文件:

    sed -i -e 's/^\(.\)/\U\1/' file.txt
    

    【讨论】:

    • 有效!而且,为什么我也会得到错误(警告??):sed:无法读取:没有这样的文件或目录?
    • @bikashg 你收到了错误,因为我的回答中有错字——抱歉——我现在已经修正了。
    【解决方案3】:

    s/^\(.\)/\U\1/ 有一些 sed 答案。 GNU sed 还有一个 \u 指令,它只将下一个字母更改为大写,所以

    sed 's/./\u&/'
    

    虽然如果一行的第一个字符是空格,你不会看到大写字母,所以

    sed 's/[[:alpha:]]/\u&/'
    

    【讨论】:

    • 我会说这是更好的答案。
    【解决方案4】:

    您可以用特殊字符代替 a-z 和 A-Z

    function up { local c="$1" ; echo -e "$c" | tr '[a-z]' '[A-Z]' ; }
    while read line
    do
      echo $(up ${line:0:1})${line:1}
    done
    

    【讨论】:

      【解决方案5】:

      使用sed:

      sed  's/^\(.\)/\U\1/' yourfile > convertedfile
      

      小解释:

      • ^ 代表一行的开始。
      • . 匹配任意字符
      • \U 转换为大写
      • \( ... \) 指定稍后要引用的部分(在本例中为 \1);括号在这里要转义。

      不要不要尝试在一个命令中将输出重定向到同一文件(即 &gt; yourfile),因为您会丢失数据。如果您想在同一个文件中替换,请查看 joelparkerhenderson 的答案。

      【讨论】:

      • 工作愉快,感谢您提供简单有效的解决方案。
      【解决方案6】:
      pearl.311> cat file1
      linenumber11
      linenumber2  
      linenumber1
      linenumber4
      linenumber6
      pearl.312> awk '{print toupper(substr($0,1,1))""substr($0,2)}' file1
      Linenumber11
      Linenumber2  
      Linenumber1
      Linenumber4
      Linenumber6
      pearl.313> 
      

      【讨论】:

      • 在 OSX 上运行良好。谢谢。
      猜你喜欢
      • 2011-03-07
      • 1970-01-01
      • 2021-08-05
      • 2014-01-02
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多