このようなテキストファイルがあります。
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
答え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。