ファイルの内容を小文字に変換する

小文字と大文字の内容を含むtempファイルがあります。

入力

tempファイルの内容:

 hi Jigar GANDHI jiga  

すべての上部を下部に変換したい

コマンド

次のコマンドを試しました:

sed -e "s/[A-Z]/[a-z]/g" temp 

出力が間違っていました。

出力

次のようにします:

hi jigar gandhi jiga 

代替部分に必要なものsed

コメント

回答

入力にASCII文字のみが含まれている場合は、次のようにtrを使用できます。

または(覚えにくく、IMOと入力しにくい;ただし、ASCIIラテン文字に限定されません。ただし、GNU trを含む一部の実装では、シングルバイト文字に制限されているため、UTF-8ロケールでは、ASCII文字に制限されています):

tr "[:upper:]" "[:lower:]" < input 

sedを使用する必要がある場合:

sed "s/.*/\L&/g" < input 

(ここではGNU実装を想定しています)。

POSIX sedでは、すべての文字変換を指定する必要があります。その後、どれを選択できます。変換する文字:

sed "y/AǼBCΓDEFGH.../aǽbcγdefgh.../" < input 

awkの場合:

awk "{print tolower($0)}" < input 

コメント

  • \LはGNU拡張機能であることに注意してください。
  • \Lはこれまでのところうまく機能しています。 GNU拡張機能
  • @JigarGandhiを作成しようとしている点を強調してください。sedはUnixコマンドです。システムが異なれば、動作も異なるさまざまなバリアントがあります。 d機能。ありがたいことに、最近では、'が最も準拠している標準があるため、すべてに共通する最小限の機能セットを信頼できます。 \Lはその中にはなく、GNU sedによって導入されました(標準のex / vi)であり、通常、他の実装では使用できません。
  • GNUなどの一部のtr実装に注意してください。 trマルチバイトロケールでは正しく機能しません(最近はほとんどがecho STÉPHANE | tr '[:upper:]' '[:lower:]'<を試してください' / div>など)。 GNUシステムでは、sedバリアントまたはawk 'の

  • わずかな修正:sed 's/.*/\L&/g' < input。一致した部分文字列への\1参照は、wurtleのように括弧付きの部分文字列を指定しない限り、機能しません'。ただし、'は、図に示すように、&を使用して一致全体を表す方が少しクリーンです。
  • 回答

    vimを使用すると、非常に簡単です:

    $ vim filename gg0guGZZ 

    開きますファイルggは、最初の行0の最初の列に移動します。guG 、ファイルの最後まですべての文字の大文字と小文字を区別します。ZZは保存して終了します。

    スローしたものはほぼすべて処理する必要があります。 「数字は無視します。非ASCIIを処理します。

    逆の場合は、小文字を大文字に変換し、uを交換します。 Ugg0gUGZZに出かけると設定されます。

    コメント

    • Lol "超シンプル"
    • これは明らかに'多くのファイルに適切にスケーリングする
    • @CoreyGoldberg vim file1 file2 fileetcすると、:bufdo gg0guG:w<CR>のようなものがおそらく / i>任意の数のファイルに対して機能します。ただし、テストは行っていません!
    • @TankorSmashはまだ' 多数のファイルに拡張できません

    回答

    私自身ddが好きです。

    <<\IN LC_ALL=C 2<>/dev/null \ dd conv=lcase hi Jigar GANDHI jiga IN 

    … gets …

    hi jigar ghandi jiga 

    LC_ALL=Cは、入力のマルチバイトを保護するためのものです。ただし、マルチバイトの大文字は変換されません。 (GNU) trについても同じことが言えます。どちらのアプリも、C以外のロケールで入力マングリングを行う傾向があります。 iconvは、いずれかと組み合わせて包括的なソリューションを実現できます。

    2>/dev/nullリダイレクトは、ddのデフォルトのステータスレポートとその標準ストリームを破棄します。これがないとddは、上記のようなジョブの完了に続き、処理されたバイト数などの情報を出力します。

    コメント

    • このソリューションは、大きなファイルを処理する場合、trよりもはるかに高速です。ありがとうございます!

    回答

    Perl 5を使用することもできます:

    perl -pe "$_=lc" temp 

    オプション-pはperlは、入力の各行に対して指定された式を1回実行し、結果、つまり$_の最終値を出力します。-eは、スクリプトを含むファイルではなく、プログラムが次の引数になります。lcは小文字に変換されます。引数がない場合は、$_。そして$_=はそれを再度保存して、印刷されるようにします。

    そのバリエーションは

    perl -ne "print lc" temp 

    -pに似ていますが、$_が最終的に印刷されない点が異なります。したがって、その変数に保存する代わりに、明示的なprintステートメントを含めます。

    sedとは対照的なPerlの利点の1つは、GNU拡張機能が必要ないことです。非GNU環境と互換性がなければならないが、すでにPerlに依存関係があるプロジェクトがあります。 trと比較すると、Perl lcをより簡単にロケール対応にすることができる可能性があります。詳細については、perllocaleのマニュアルページを参照してください。

    回答

    キャプチャする必要があります一致したパターンを修飾語で置き換えて使用します:

    sed "s/\([A-Z]\)/\L\1/g" temp 

    \(...\)は一致したテキストを囲むと、最初のキャプチャは\1に移動し、次は\2などに移動します。番号は次の場合の開始括弧に基づいています。ネストされたキャプチャ。

    \Lは、キャプチャされたパターンを小文字に変換します。大文字の場合は\Uもあります。 。

    コメント

    • これを行う必要はありません。パターン全体が常に&に取り込まれます。
    • 本当ですが、一致のキャプチャについて説明する機会を逃していたでしょう:-)

    回答

    MvGの回答に加えて、Perl6を使用することもできます。

    perl6 -pe .=lc temp

    ここで$ _は暗黙的であり、シェルによる拡張から保護するために一重引用符は必要ありません($ _は特別なBashパラメーターです。参照: https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    Deep Theme Powered by WordPress