誰かがテキストファイル内のすべての小文字を大文字に変換して新しいファイルとして保存する方法を説明しますか?私のファイルは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
が、sed
GNUでのみ動作します(\U
標準ではありません)。
そしてperl
:
<input.txt perl -Mopen=locale -pe '$_=uc' >output.txt
それはロケールのtoupper
規則を使用しないので、次の単語に適しています。オフィス(ffi
1文字を3文字に変換するFFI
1)。
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:]
awk
:toupper
に変更tolower
dd
:ucase
に変更lcase
- GNU
sed
//ex
:次へvi
変更\U
\L
perl
:uc
に変更lc
。uconv
:upper
に変更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
sed
GNU(Linuxシステムで最も使用されている)を使用してコマンドラインでこれを実行できます。
sed -e 's/\([a-z]\)/\U\1/g' filename >newfilename
説明する:
sed
正規表現を使用して文字列ストリームを別のものとして扱うことができるプログラム。標準入力またはファイルの入力を受け入れ、標準出力に書き込みます。
それでは、使用された正規表現を分析してみましょう。
置換するには、s/<expression>/<new_expression>/g
構文を使用して置換する一致するテキストを検索し、他の式を使用して置換する方法を示します。一致するものを見つけるために使用する正規表現は([a-z])
(角かっこをエスケープするバックスラッシュを無視する)です。この正規表現は小文字を探します。式を括弧で囲むと、後で参照できるように文字を保存できます。
次に置換に使用します。\U\1
ここで\U
大文字に変換し(大文字の場合は「U」)、\1
正規表現を括弧で囲んで保存した文字です。
追加資料:
答え4
提案されたsed-oneliners(@Stéphane Chazelas、@Kusalananda)はすべて「s」サブコマンドを使用しますが、これは作業に最適なツールではありません。ある文字セットを別の文字に変更するには、「y」を使用する方が簡単で便利です。
sed 'y/abcde/ABCDE/' infile > outfile
最初の文字列に表示される最初の文字を2番目の文字列の最初の文字に変換し、最初の文字列に表示される2番目の文字を2番目の文字列の2番目の文字に変換します。上記の「abcde」文字列を目的の「文字変換テーブル」に置き換えると、sedが処理できるすべての文字セット/エンコードを使用してファイルを変換できます。