trを使用して大文字と小文字を区別するようにテキストを変更するにはどうすればよいですか?

trを使用して大文字と小文字を区別するようにテキストを変更するにはどうすればよいですか?

~によるとhttps://caseconverter.com/

「Capital」はこうしてすべての文字を大文字に変換します。

「小文字」は、以下のようにすべての文字を小文字に変換します。

「正しい大文字と小文字」は、次のように各単語の最初の文字が大文字で表示されるようにテキストを変換します。

「文章事例」。これにより、各文の最初の文字を大文字に置き換え、残りのテキストは小文字に変換します。したがって、各ピリオドの後の最初の文字は自動的に大文字に変換されます。

最初の2つはコマンドで簡単に実行できますtr

user@linux:~$ tr [:lower:] [:upper:] <<< eXaMPLe
EXAMPLE
user@linux:~$ 

user@linux:~$ tr [:upper:] [:lower:] <<< eXaMPLe
example
user@linux:~$ 

または

user@linux:~$ tr [a-z] [A-Z] <<< eXaMPLe
EXAMPLE
user@linux:~$ 

user@linux:~$ tr [A-Z] [a-z] <<< eXaMPLe
example
user@linux:~$ 

最後の2つの「定格ケース」と「文章ケース」はどうですか?

可能ですか?

もしそうなら教えてください。

そうでない場合、代替は何ですか?

答え1

シェルがワイルドカードをfishサポートしていない限り、[...]これを引用する必要があります[:lower:][A-Z]それ以外の場合、シェルはそれを現在のディレクトリの一致するファイルのリストに拡張できます(一致しない場合はエラーを報告します)。

tr '[:lower:]' '[:upper:]'

その他の注意事項:

  • GNU実装はtrシングルバイト文字のみをサポートしているため、UTF-8ロケールは分音符なしで英語文字のみを大文字で表示します。
  • tr '[A-Z]' '[a-z]'大丈夫ですが、単にこれを行うこともできますtr A-Z a-z(POSIX準拠の実装では)。ただし、ABCDEFGHIJKLMNOPQRSTUVWXYZC/POSIX ロケールでのみ一致が保証されます。

GNU実装を使用して各単語の最初の文字を大文字で表示するには、sed次のようにします。

sed -E "s/[[:alnum:]_'-]+/\u&/g"

は含まれますが、'他の句読点は含まれません。-_foo-bar2baz,fooFoo-bar2baz,Foo

これはマルチバイト文字に対しては機能しますが、ほとんどのロケールでは文字を次のように処理しないため、通常は文字結合には機能しませんalnum

$ echo $'ste\u0301phane' | sed -E "s/[[:alnum:]_']+/\u&/g"
StéPhane

これを説明するためにに切り替えると、perl次のようになります\pM

$ echo $'ste\u0301phane chazelas' | perl -Mopen=locale -pe 's/[\w\pM'\''-]+/\u$&/g'
Stéphane Chazelas

また、これはfirst(最初の文字が合字 文字である)に変換されますFIrstucfirst()代わりにuc()/を使用すると、\uこの問題を回避できます。

$ echo 'first second' | perl -Mopen=locale -pe 's/[\w\pM'\''-]+/ucfirst$&/ge'
First Second

文章 大文字を使う場合はとても面倒です。テキストの先頭または文章の区切り記号(たとえば、..、、?... )、または文の紹介者(¿、、)の後の最初の文字を大文字として使用して、間にスペースを入れる必要があります。 、しかし、、、、、、、…)のような¡ものもあります。サポートする言語によっては、さらに考慮する必要があります。(["«

次のようにこれを実行できますperl

perl -0777 -C -pe 's/(^|[.!?…⁇⁈⁉¿¡])[\s([{"`‶‷«]*\K\p{Ll}/ucfirst$&/ge'

これはUTF-8ロケールと入力を前提としており、いくつかのケースのみを扱います。

とにかくこれは音訳だけtrではtr成し遂げられることではない。すべて文字を単に音訳と呼ぶことはできません。

答え2

いいえ、一人では不可能ですtrtr仕事を遂行するのに必要な言葉や文章を理解していません。

あるいは、PerlとPerlの強力なパターンエンジンを試してみてください。

$ perl -pe 's/\b[\p{L}\p{Pd}]+/ucfirst lc $&/ge' <<< 'A HEART-SHAPED BOX'
A Heart-shaped Box
$ perl -pe 's/\p{L}.*?[.?!]/ucfirst lc $&/ge' <<< 'for sale. baby shoes. never worn.'
For sale. Baby shoes. Never worn.

しかし、上記の回避策は迅速で汚れており、可能なすべてのケースを扱うわけではありません。が必要です。 )。そうすれば、どちらもできませんtr

答え3

tr単一文字を別の単一文字に変更(または削除)するだけで、どの文字のコンテキストも理解できません。したがって、単語の先頭、中間、末尾の文字を区別することはできません。 「単語」とは何なのかわかりません。

テキストを次に変更してください。タイトルケース(「適切な状況」と呼ぶもの)または文章の状況は使用できませんtr

個々のキャラクターのコンテキストを提供するツールが必要です。

sed以下は、個々の単語を一致させ、最初の文字を変更してテキストをタイトルケースに変換する簡単なGNUプログラムです。

$ sed 's/\<\([[:lower:]]\)\([[:alnum:]]*\)/\u\1\2/g' file
There Is No Danger On The Roof. There Is No Cow On The Ice.

\<変換ポイント(単語の先頭など)での単語ではなく、文字と単語の文字の一致。正規表現の残りの部分は、小文字の後にランダムな数の英数字が続くものと一致します。一致するものがあれば、小文字を大文字に変更し、残りの単語を追加します。最初の文字の大文字の使用はGNUsed拡張を使用します(他のほとんどの実装には適用されませんsed)。

テキストの文章をシェルするための別の単純なGNUバリアントがありますsed

$ sed 's/\<\([[:lower:]]\)\([^[:punct:]]*\)/\u\1\2/g' file
There is no danger on the roof. There is no cow on the ice.

これはほぼ同じですが、英数字の単語を一致させるのではなく、句読点ではなく文字列を一致させます。

これは、質問に表示される種類の非常に単純なテキストにのみ適用されます。sedたとえば、2番目は句読点と一致するwhat's that?ため、正しく処理されません。'[[:punct:]]

答え4

zsh最初の3つにはL、、Uパラメータ拡張フラグがあり、最初にはcsh-style /修飾子またはksh-style /があり、4番目はキャプチャグループを使用してksh-styleを使用して実行できます。C:l:utypeset -u-l${param//pattern/replacement}

text='The RIVER dee in Aberdeen can be cold,
 so i shiver when i swim. Scotland is STILL beaUtIful though.
 eveN when it RAINS? "YES! of course", is the obvious answer.'
$ print -r -- ${(L)text}
the river dee in aberdeen can be cold,
 so i shiver when i swim. scotland is still beautiful though.
 even when it rains? "yes! of course", is the obvious answer.
$ print -r -- ${(U)text}
THE RIVER DEE IN ABERDEEN CAN BE COLD,
 SO I SHIVER WHEN I SWIM. SCOTLAND IS STILL BEAUTIFUL THOUGH.
 EVEN WHEN IT RAINS? "YES! OF COURSE", IS THE OBVIOUS ANSWER.
$ print -r -- ${(C)text}
The River Dee In Aberdeen Can Be Cold,
 So I Shiver When I Swim. Scotland Is Still Beautiful Though.
 Even When It Rains? "Yes! Of Course", Is The Obvious Answer.
$ print -r -- $text:l
the river dee in aberdeen can be cold,
 so i shiver when i swim. scotland is still beautiful though.
 even when it rains? "yes! of course", is the obvious answer.
$ print -r -- $text:u
THE RIVER DEE IN ABERDEEN CAN BE COLD,
 SO I SHIVER WHEN I SWIM. SCOTLAND IS STILL BEAUTIFUL THOUGH.
 EVEN WHEN IT RAINS? "YES! OF COURSE", IS THE OBVIOUS ANSWER.
$ typeset -l text
$ print -r -- $text
the river dee in aberdeen can be cold,
 so i shiver when i swim. scotland is still beautiful though.
 even when it rains? "yes! of course", is the obvious answer.
$ typeset -u text
$ print -r -- $text
THE RIVER DEE IN ABERDEEN CAN BE COLD,
 SO I SHIVER WHEN I SWIM. SCOTLAND IS STILL BEAUTIFUL THOUGH.
 EVEN WHEN IT RAINS? "YES! OF COURSE", IS THE OBVIOUS ANSWER.
$ set -o extendedglob
$ typeset +u text
$ print -r -- ${${text:l}//(#b)(((#s)|[.!?…⁇⁈⁉¿¡])[[:space:][\{\"\`‶‷«]#)([[:lower:]])/$match[1]${match[3]:u}}
The river dee in aberdeen can be cold,
 so i shiver when i swim. Scotland is still beautiful though.
 Even when it rains? "Yes! Of course", is the obvious answer.

私の他の答えと同じ警告です。

関連情報