大文字の文字列を小文字に変換するコマンド?


47

大文字の文字列を小文字に、またはその逆に変換するために使用できるBashコマンドとは何ですか?

ありがとうございました。



2
stackoverflow.com/questions/2264428/にも多くのソリューションがあります。大まかに一見すると、ほとんどがここでもカバーされているようです。
pbhj

回答:


59

文字列が既に変数に保存されている場合、具体的には(bash 4.0以降で使用bash可能)のパラメーター展開を使用できます${parameter,,pattern}。ここで、parameterは変数の名前であり、pattern省略されます。

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

これは変数の値を変更せず、出力のみを変更することに注意してください。変数を変更するには、新しい値を割り当てる必要があります。

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

大文字変換は以下で動作し${parameter^^pattern}ます:

$ echo ${string^^}
HELLO, WORLD!

これはUnicode文字列でも動作します(少なくとも現在のbashバージョンでは、おそらく少なくともbash 4.3が必要です):

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

を使用している場合はzshパラメーター拡張フラグ${(FLAGS)NAME}; zsh 2.5以降で使用可能)を使用して同じ結果を得ることができます。bash構文は次のとおりで動作しませんzsh )1。小文字のフラグはL;です。大文字の場合U

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

これはUnicode文字列でも動作します(少なくともzsh 5.0以降。以前のバージョンでは試しませんでした)。

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ



1) zshがこれをはるかに長く持っていたことを見ると、おそらく次のようになるはずです:zsh構文はで機能しませんbash


3
この${string,,}表記は、bashバージョン4+にのみ存在します。それ以外の場合は、などの他のソリューションのいずれかが必要です$(echo $string | tr '[:upper:]' '[:lower:]')
クインコメンダント16

40

Unicodeで正しく機能するメソッドはほとんどありません。

GNU sed 4.2.2の動作

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

bash 4.2.45宣言が機能しませ

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

bash 4.2.45パラメーターの展開が機能しない

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declareおよびパラメーター拡張の動作

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU tr 8.20は機能しませ

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk(Ubuntu 13.10のデフォルトawk)は機能しませ

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

gawkの動作

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

Perl pure uc()は機能しませ

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

UnicodeヒントのないPython 2は機能しませ

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

Unicodeの動作を処理するように指示されたPython 2 :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

Python 3の動作

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ

1
Ubuntu 13.04ではgawk、デフォルトのawkがあります(をupdate-alternatives --display awk参照)。mawk13.10のデフォルトは確かですか?
キリ

seds 1990年以降、\Uオプションがサポートされています;-)。gnu-sed固有の機能ではありません。それ以外の場合、素晴らしい答え、非常に多くのオプション、非常に短い時間;-)すべてに幸運を!
シェルター

- :プラス、以下のリンクで、より外観のため、(点線およびIをドットなし)、トルコとのいくつかの問題があるでしょうunicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/... - en.wikipedia。 org / wiki / Dotted_and_dotless_I
azat 14

あなたの例では、財布は、ucあなたがする必要があるため、Perlでは動作しませんuse Encodeuse utf8。サンプルを次のように書き換えると、 echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'動作します。stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy

20

小文字の変数を定義するには、bashの内部タイプセットまたは宣言コマンドを使用します。

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

変数をタイプセットするときではなく、値が設定されるときに文字が下げられます。そのため、スクリプトの最初にタイプセットすることをお勧めします。大文字の場合、-uタイプセットできます

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

これは、bshシェルに固有のものではなく、kshでも機能します。POSIXシェル定義の場合もあります。

編集:多くの人々は、タイプセットがbashでは廃止され、declareに置き換えられたという事実を優しく指摘してくれました。両方のコマンドは同等です。

$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.


$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

異種環境で作業するとき、私自身はまだタイプセット構文を使用しているので、スクリプトを書き直す必要はありません。


2
+1信じられない、私はそれを知らなかった!ところで、いくつかの余分な情報:私は手動でこれまでに見て、それは思わtypesetにより廃止予定とみなされ、交換されるdeclare
トム・

1
@thomありがとう、bashはその「ボーンシェルルート」から遠く離れた生活を始めたようです:)
エマニュエル

17

trコマンドで実行できます。

ターミナル内(Ctrl+ Alt+ T

このコマンド:

echo 'String here' | tr "[:lower:]" "[:upper:]"

小文字を大文字に変換します。

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

大文字を小文字に変換します。

例:

ここに画像の説明を入力してください

クレジットはサイバーシティに行きます


2
ロケールを気にしない場合tr A-Z a-zも同様に機能します。
ニックマッテオ

9

物事をパイプすることsedもできます:

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

そして\L逆の効果があります:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase

1

これは純粋なbashソリューションではありませんが、perlOliが行ったようにsed)文字列をパイプ処理できます。

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

そして\L逆の効果があります:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase

-1

この単純なコマンドを使用します。大文字から小文字の場合「f」は、変換を行うファイル名です。

tr "A-Z" "a-z" < f

小文字から大文字の場合

tr "a-z" "A-Z" < f

1
古い回答のコメントで述べたよう、これは一部のロケールでは機能しません。
ムル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.