テキストファイルを小文字から大文字に変換して新しいファイルとして保存する方法

テキストファイルを小文字から大文字に変換して新しいファイルとして保存する方法

誰かがテキストファイル内のすべての小文字を大文字に変換して新しいファイルとして保存する方法を説明しますか?私のファイルはNewFile.txtと呼ばれ、500行の任意の文字が含まれています。

答え1

POSIX ツールボックスには次のものがあります。

<input.txt tr '[:lower:]' '[:upper:]' >output.txt

しかし、参考にしてくださいGNU 実装では、シングルバイト文字でのみ機能します。;たとえば、UTF-8文字セットを使用するロケールでは、発音区別記号を持たないabcdefghijklmnopqrstuvwxyz文字のみを使用できます。

<input.txt awk '{print toupper($0)}' >output.txt

また、POSIXで使用できますawk

<input.txt dd conv=ucase >output.txt

POSIXもありますが、ASCII以外の文字を翻訳する実装はあまりありません。

<input.txt sed 's/.*/\U&/g' > output.txt

GNUで動作しますsedが、sedGNUでのみ動作します(\U標準ではありません)。

そしてperl

<input.txt perl -Mopen=locale -pe '$_=uc' >output.txt

それはロケールのtoupper規則を使用しないので、次の単語に適しています。オフィス1文字を3文字に変換するFFI1)。

uconv、ICUプロジェクトのプロジェクトは、さまざまな国際コーナーケースを非常にうまく処理する必要があり、入力/出力がUTF-8(またはuconv --default-code返されるすべての項目)でエンコードされていると仮定します。他の入出力エンコーディングを指定するには、/および-f/--from-codeオプション-t--to-code参照してください。

<input.txt uconv -x upper >output.txt

vimエディタでファイルの最初の文字にある場合(gg行く)、gUGファイルの最後まですべての文字を大文字に変換するように入力します。その後、:saveas output.txt出力ファイルに保存します。

またはanyまたはex実装viを使用してください(すべての実装が非ASCII文字を処理するわけではありませんが):(:%s/.*/\U&/そして:w output.txt編集されたファイルを作成し、output.txt現在:q!変更されている入力ファイルを保存せずに終了します)。

シェルを含むzsh:

zmodload zsh/mapfile
mapfile[output.txt]=${(U)mapfile[input.txt]}
# or (csh-style):
mapfile[output.txt]=$mapfile[input.txt]:u

まだわからない場合に備えて、大文字を小文字に変換するには:

  • tr: 交換[:lower:]金額[:upper:]
  • awktoupperに変更tolower
  • dducaseに変更lcase
  • GNU sed// ex:次へvi変更\U\L
  • perlucに変更lc
  • uconvupperに変更lower
  • vim:(これはトリックの1つです)gUGに変更します。guG
  • zsh:、、に(U)変更します。(L):u:l

1 C / POSIX toupper()/ towupper()APIは一度に1文字だけを別の文字に変換できるため、テキストの大文字と小文字を変更する方法には制限があります。バラよりhttps://unicode-org.github.io/icu/userguide/icu/posix.html#case-mappingsこれについてそしてもっと。

答え2

組み込みコマンドのみを使用するbash one(ish)ライナー...

f="$(< infile.txt)" ; printf "%s" "${f^^}" > outfile.txt ; unset f

f一時変数を内容で埋めますinfile.txt

f次に、bash変数トリックを使用して大文字でマークし(${f^^})、STDOUTをにリダイレクトしながらSTDOUTに印刷しますoutfile.txt

警告:「ランダム」がラテン語と印刷可能な文字から外れると、この問題が発生する可能性があります。また、末尾の改行文字も削除します。

コメントによれば、これはより良い可能性があります(より効率的で改行を捨てません)。

readarray f < infile.txt ; printf %s "${f[@]^^}" > outfile.txt ; unset f

答え3

sedGNU(Linuxシステムで最も使用されている)を使用してコマンドラインでこれを実行できます。

sed -e 's/\([a-z]\)/\U\1/g' filename >newfilename

説明する:

sed正規表現を使用して文字列ストリームを別のものとして扱うことができるプログラム。標準入力またはファイルの入力を受け入れ、標準出力に書き込みます。

それでは、使用された正規表現を分析してみましょう。

置換するには、s/<expression>/<new_expression>/g構文を使用して置換する一致するテキストを検索し、他の式を使用して置換する方法を示します。一致するものを見つけるために使用する正規表現は([a-z])(角かっこをエスケープするバックスラッシュを無視する)です。この正規表現は小文字を探します。式を括弧で囲むと、後で参照できるように文字を保存できます。

次に置換に使用します。\U\1ここで\U大文字に変換し(大文字の場合は「U」)、\1正規表現を括弧で囲んで保存した文字です。


追加資料:

  • 逆参照とサブ式。これは、後で参照できるように一致を保存して再参照するために使用する角かっこです。\1
  • 大文字/小文字変換。ここでは、詳細な指示\Uと変換に使用できる他の演算子を見つけることができます。

答え4

提案されたsed-oneliners(@Stéphane Chazelas、@Kusalananda)はすべて「s」サブコマンドを使用しますが、これは作業に最適なツールではありません。ある文字セットを別の文字に変更するには、「y」を使用する方が簡単で便利です。

sed 'y/abcde/ABCDE/' infile > outfile

最初の文字列に表示される最初の文字を2番目の文字列の最初の文字に変換し、最初の文字列に表示される2番目の文字を2番目の文字列の2番目の文字に変換します。上記の「abcde」文字列を目的の「文字変換テーブル」に置き換えると、sedが処理できるすべての文字セット/エンコードを使用してファイルを変換できます。

関連情報