テキストファイルの各行について、セミコロンの後の最初の文字を大文字にします。

テキストファイルの各行について、セミコロンの後の最初の文字を大文字にします。

このようなテキストファイルがあります。

John Doe;john Doe is ...;he lives in ...
Mike Nelson;mike Nelson works for ...;he makes ...
Marcy William;marcy's mother is ...;marcy travels a lot... 

セミコロンの後のすべての文字を大文字に変換したいので、最終結果は次のようになります。

John Doe;John Doe is ...;He lives in ...
Mike Nelson;Mike Nelson works for ...;He makes ...
Marcy William;Marcy's mother is ...;Marcy travels a lot...

残りはそのままにしておきます。

ファイルにはアクセント文字が含まれており、UTF-8でエンコードされています。

答え1

GNU Sed:

sed 's/;[[:lower:]]/\U&/g' file

セミコロン( );[[:lower:]]の後のすべての小文字は大文字にします。\U特別な順序。このgフラグは、1行のすべての項目を置き換えます。

GNU Sedが利用できない場合は、POSIX準拠の代替手段を使用できます。前任者

printf '%s\n' '%s/;[[:lower:]]/\U&/g' '%p' | ex file

代替コマンドは同じですが、すべての行をアドレス指定に使用する必要があります%%p印刷物。ファイルを直接%p変更するにはx

答え2

awkやsedではなくPerlです。

perl -C -pe 's/;(.)/;\u$1/g'

この-Cオプションは、ロケール環境変数(など)に従ってUTF-8 i / oをオンまたはオフにしますLC_ALL。無条件UTF-8入力と出力を使用するにはに変更します-CSD

Unicode 大文字と小文字の区別は難しいです。それは変わります。離散入力する離散正しいというよりは離散(トルコ語の名前は大文字でもiの上にドットがあります。)

答え3

Perlを使用する1つの方法は次のとおりです。

perl -C -pe 's/;(.)/";" . uc($1)/eg' file

入力ファイルにアクセントが表示されないため、テストにこれを使用しました。

$ cat file
John Doe;john Doe is ...;he lives in ...
Mike Nelson;mike Nelson works for ...;he makes ...
Émilie du Châtelet;émilie du Châtelet;works for ...;she makes ...
Marcy William;marcy's mother is ...;marcy travels a lot...
Άσπα Κυριάκου;άσπα's brother is ...; άσπα likes fish

次を生成します。

$ perl -C -pe 's/;(.)/";" . uc($1)/eg' file
John Doe;John Doe is ...;He lives in ...
Mike Nelson;Mike Nelson works for ...;He makes ...
Émilie du Châtelet;Émilie du Châtelet;Works for ...;She makes ...
Marcy William;Marcy's mother is ...;Marcy travels a lot...
Άσπα Κυριάκου;Άσπα's brother is ...; άσπα likes fish

説明する

  • -C: man perlrun(詳細を参照) デフォルトでは、utf8 を有効にします。
  • -pe:入力ファイルを1行ずつ読み、与えられたスクリプトを適用して各行を印刷しますe

s/old/new/flagsこれは一般的な形式です。である代替演算子内で発生します。つまり、動作方法を上書きしてold制御newします。flagsここで使用されるフラグは、e代替でPerlコードを有効にすることです。gこれは、「この行のすべての一致に適用」を意味します。

;(.)a後ろのすべての文字をキャプチャして;保存します$1。次に、これをaに置き換えて、;その文字を大文字(uc($1))に変換します。

答え4

Raku(旧Perl6)を使う

Perl6 / Rakuプロジェクトの1つの利点は、最初からUnicodeをエレガントに処理するように設計されていることです。良いテストファイルを投稿してくれた@terdonに感謝します。

~$ raku -pe 's:g/ \;(.) /;{$0.uc}/;'  terdon_uni.txt
John Doe;John Doe is ...;He lives in ...
Mike Nelson;Mike Nelson works for ...;He makes ...
Émilie du Châtelet;Émilie du Châtelet;Works for ...;She makes ...
Marcy William;Marcy's mother is ...;Marcy travels a lot...
Άσπα Κυριάκου;Άσπα's brother is ...; άσπα likes fish

上記では、セミコロンの後の最初の文字キャプチャを見ることができます。フラグ:g(の略:global)が演算子の先頭に移動するので、s///最初から探している一致が何であるかがわかります。 Raku start$0などのキャプチャを参照してください$1$2演算子の「一致」(左)の半分はs///空白を許容するため、読みやすさが向上します。演算子の「交換」(右)部分は終了を示すs///ために使用されます{…}

以下では、Rakuのキャプチャタグを使用しています<(…)>。 Rakuの<(…)>外部文字はPerl5フラグと同じです\K。一致は行われましたが、<(…)>マークはラクに外部のすべてを捨て、<(…)>内部(キャプチャ)をロードするように指示しました$/。 Rakuは完全一致を実行しますが、変更したい正確な文字のみをキャプチャするため、代替作成が大幅に簡素化されます。

~$ raku -pe 's:g/ \; <(.)> /{$/.uc}/;'  terdon_uni.txt
John Doe;John Doe is ...;He lives in ...
Mike Nelson;Mike Nelson works for ...;He makes ...
Émilie du Châtelet;Émilie du Châtelet;Works for ...;She makes ...
Marcy William;Marcy's mother is ...;Marcy travels a lot...
Άσπα Κυριάκου;Άσπα's brother is ...; άσπα likes fish

HTH。

https://raku.org

関連情報