trをutf-8機能に置き換える

trをutf-8機能に置き換える

詩の一行から最後の単語を分離するために(すべての韻律リストを取得するために)、私はこれを得るためにいくつかのコードを一緒に使用しました。

awk '{print $NF}' input.txt | tr 'A-Z' 'a-z'  | tr -sc 'a-z' '\n' | rev |  sort | uniq | sort -d | rev

次のような場合に適用してみてください。

Se a ciascun l'interno affanno
Si leggesse in fronte scritto
Quanti mai, che invidia fanno
Ci farebbero pietà! 

わかりました。

fanno
affanno
scritto
piet

ご覧のとおり、「という言葉があります。キリストのための喪「アクセント文字が欠落しています。これはtr UTF-8機能がないためです。この行で同じことができますが、UTF-8アクセント文字を保存できるtrに代わるものはありますか?

ベストアンサー1

trマルチバイト文字とその代替のいくつかのGNU実装の制限は次のとおりです。Unicode文字のtrシミュレーション?

ここですべてのことができますawk(GNU実装は少なくともマルチバイト文字とローカライズをサポートします)。

< yourfile awk '{
  last = tolower($NF)
  gsub(/[^[:alpha:]]+/, "\n", last)
  print last}' |
  rev | sort -u | rev

これは作る:


pietà
fanno
affanno
scritto

または、各行から最後の文字シーケンスを取得することが目的である場合は、次のように使用しますperl(ロケールに応じてすべてのデコードを実行し、小文字、逆方向、ロケールの組み合わせに変換することもできます)。

<your-file perl -Mopen=locale -MPOSIX -lne '
  $word{lc $1}++ if /(\p{Letter}+)\P{Letter}*$/;
  END {
    print $_->[0] for
      sort {strcoll($a->[1], $b->[1])}
      map {[$_, scalar reverse $_]} keys %word
  }'

またはGNUツールを使用してください。

<yourfile grep -Po '\pL+(?=\PL*$)' | sed 's/.*/\L&/' | rev | sort -u | rev

または、次のコマンドを使用して最後の文字シーケンスを抽出しますsed

<yourfile sed -E '/([[:alpha:]]+)[^[:alpha:]]*$/!d;s//\n\L\1/;s/.*\n//' |
  rev | sort -u | rev

最初の作業の後に行うと簡単になりますrev

<yourfile rev |
  sed -nE 's/^[^[:alpha:]]*([[:alpha:]]+).*$/\L\1/p' |
  sort -u | rev

おすすめ記事