【问题标题】:Replace first symbol of sentence with capital letter用大写字母替换句子的第一个符号
【发布时间】:2013-05-21 02:28:51
【问题描述】:

我需要帮助我将输入文件input.txt中的句子中第一个单词的首字母大写:

t这是我的第一句话。 a这是第二句话。 t帽子是第三个。

我想让输出在输出文件output.txt中看起来像这样:

T这是我的第一句话。 A这是第二句话。 T第一个就是第三个。

【问题讨论】:

  • 如果您先展示您的尝试,我们可以为您提供帮助。提示:它可能涉及使用perlawk
  • 欢迎来到 SO。请花点时间阅读stackoverflow.com/faq

标签: bash capitalization capitalize


【解决方案1】:

bash version 4方式:

#!/usr/local/bin/bash

while IFS="." read -r -a line ; do
    for ((i=0; i<${#line[@]}; i++)) do
        if [[ $i > 0 ]]; then
            temp=$(echo ${line[$i]/ /})
            echo -n "${temp^}. "
        else
            echo -n "${line[$i]^}. "
        fi
    done
    echo
done < file

【讨论】:

  • 谢谢它有效,但它不适用于以 ľ š č ť ž ý á í é ď 等开头的句子。有什么想法吗?
  • @Tommy bash v4 处理它。如果没有,那么您的 locale 未设置为处理此问题。您可能至少需要将 LC_CTYPE 设置为 UTF-8 变体。
【解决方案2】:

awk 方式呢?

$ awk -F"\. " '{OFS=". "}{for (i=0;i<=NF;i++) {sub(".", substr(toupper($i), 1,1) , $i)}} {print}' output.txt 
This is my first sentence. And this is the second sentence. That one is the third.
  • -F"\. " 将字段分隔符设置为 .(点 + 空格)。
  • {OFS=". "} 将输出字段分隔符设置为 .(点 + 空格)。
  • '{for (i=0;i&lt;=NF;i++) {sub(".", substr(toupper($i), 1,1) , $i)}} 循环遍历每个字段,首字母大写。因为第一个字段是this is my first sentence,它只是大写this

【讨论】:

    【解决方案3】:

    试试这个:

    sed -r "s/(^|\.\s+)./\U&/g" <input.txt >output.txt
    

    【讨论】:

    • 您好,我发现它不适用于所有 UTF8 符号。这是针对斯洛伐克语系统和句子有时以 ľ š č ť ž ý á í é ď 等开头的。我想解决这个问题吗?
    • 如果您的语言环境设置正确,它应该可以工作(请参阅here)。
    • 好吧,我将语言环境更改为斯洛伐克语 utf8,但它不起作用..它用一些抢劫字符替换特殊字符。有什么想法吗?
    • 我检查了德语 UTF-8 语言环境,它工作得很好。你调整LANGLC_*了吗?你的终端支持 UTF-8 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    相关资源
    最近更新 更多