web-dev-qa-db-ja.com

SEDを使用して単語の最初の文字を大文字にする

単語の最初の文字を大文字にどのように置き換えますか。

Trouble me
Gold Rush brides

Trouble Me
Gold Rush Brides
40
neversaint

この行はそれを行うべきです:

sed -e "s/\b\(.\)/\u\1/g"
73
tangens

awkの使用:

awk '{for(i=1;i<=NF;i++){ $i=toupper(substr($i,1,1)) substr($i,2) }}1' file

出力は次のようになります。

Trouble Me
Gold Rush Brides
23
ghostdog74

各Wordの最初の文字を大文字にするには、次のsedコマンドを使用します。

echo -e "Trouble me \nGold Rush brides" | sed -r 's/\<./\U&/g'

出力

Trouble Me
Gold Rush Brides

-rスイッチは、拡張正規表現を使用するようにsedに指示します。 sedへの指示は、「search and replace "(最初のs)パターン\<.とパターン\U&globally 、つまり、すべての行のすべてのインスタンス(つまり、最後のg修飾子)。私たちが探しているパターンは\<.であり、これは Word境界\<)の後に 任意の文字.)を探しています。置換パターンは\U&で、\Used次のテキストを大文字にする を指示し、&\0の同義語 であり、「一致しました」。この場合、「一致したすべてのもの」は.が一致したものにすぎません。Wordの境界は一致に含まれないためです(代わりにアンカーです)。 .が一致するのは1文字だけなので、これは大文字です。

16
rekha_sri

私にはアポストロフィがあったので、最初の解決策で作業しました...

mike@mike-laptop3:~$ echo "BEST WESTERN PLUS BOB's INN" | tr "[A-Z]" "[a-z]" | sed -e "s/\b\(.\)/\u\1/g"

ベストウェスタンプラスボブズイン

mike@mike-laptop3:~$ echo "BEST WESTERN PLUS BOB's INN" | tr "[A-Z]" "[a-z]" | sed "s/\( \|^\)\(.\)/\1\u\2/g"

ベストウエスタンプラスボブズイン

5
mikejonesey

Sedを使用した別の短いバージョン:

sed -e "s/\b./\u\0/g"
4
chtimi59

私はあなたがsedと言ったのを知っていますが、シェルスクリプトの場合、私にとって最も簡単で柔軟性の高い方法の1つは、ほとんどのシステムで利用できるPythonを使用することでした。

_$ echo "HELLO WORLD" | python3 -c "import sys; print(sys.stdin.read().title())"
Hello World
_

例えば:

_$ lorem | python3 -c "import sys; print(sys.stdin.read().title())"
Officia Est Omnis Quia. Nihil Et Voluptatem Dolor Blanditiis Sit Harum. Dolore Minima Suscipit Quaerat. Soluta Autem Explicabo Saepe. Recusandae Molestias Et Et Est Impedit Consequuntur. Voluptatum Architecto Enim Nostrum Ut Corrupti Nobis.
_

strip()などを使用してスペースを削除したり、capitalize()を使用したりすることもできます。

_$ echo "  This iS mY USER ${USER}   " | python3 -c "import sys; print(sys.stdin.read().strip().lower().capitalize())"
This is my user jenkins
_
3
Havok

これまで提案されたsedソリューションは、元のテキストが小文字の場合にのみ機能します。 tr '[[:upper:]]' '[[:lower:]]'入力を小文字に正規化するには、オールインワンのsedソリューションを使用すると便利です。

sed 's/\w\+/\L\u&/g'

これは単語(\wはWord文字を意味し、\+少なくとも1つ、次の非Word文字まで)、最後まで小文字(\Lbut次の(つまり最初の)文字を大文字(\u)各(g)一致式(&)。

[ クレジット ]

sedtrを併用:

name="athens"
echo $name | sed -r "s/^[[:alpha:]]/$(echo ${name:0:1} | tr [[:lower:]] [[:upper:]])/"
0
mark_infinite

Bashの使用(sedを使用しないため、トピックから少し外れています):

msg="this is a message"
for Word in $msg
do
   echo -n ${Word^} ""
done

This Is A Message
0
Dominique Baldo