Text-Processing
用 utf-8 功能替換 tr
為了隔離一首詩的任何一行中的最後一個單詞(列出所有押韻),我將幾個程式碼片段放在一起獲得這個
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