Text-Processing

用 utf-8 功能替換 tr

  • May 15, 2022

為了隔離一首詩的任何一行中的最後一個單詞(列出所有押韻),我將幾個程式碼片段放在一起獲得這個

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

如您所見,“ pietà ”這個詞沒有重音字元。我想這取決於沒有 tr UTF-8 功能。是否有任何替代 tr 能夠在這一個班輪中執行相同的任務,但保留 UTF-8 重音字元?

tr關於多字節字元及其一些替代方案的 GNU 實現的限制在tr analog for unicode 字元中涵蓋?.

在這裡,你可以做任何事情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

引用自:https://unix.stackexchange.com/questions/702533