用 utf-8 功能替换 tr

用 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

正如你所看到的,这个词“哀悼基督“缺少重音字符。我想这取决于没有 tr UTF-8 功能。是否有任何替代 tr 能够在这一行中执行相同的任务,但保留 UTF-8 重音字符?

答案1

GNU 实现在多字节字符方面的限制tr及其一些替代方案在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

答案2

使用(以前称为 Perl_6)

raku -e 'my @a.=push: .comb(/<alpha>+/)[*-1] if .chars for lines;  \
        .put for @a.unique>>.flip.sort( *.fc.trans: "àèéìòù" => "aeeiou" )>>.flip;' 

或者

raku -e 'my @a.=push: .comb(/<alpha>+/)[*-1] if .chars for lines; \
        .put for @a.unique.map(*.flip).sort( *.fc.trans: "àèéìòù" => "aeeiou" ).map(*.flip);' 

以上是编码的答案,默认情况下它是为了处理 Unicode 而构建的。简而言之,如果lines包含chars字符(即不为空),则为通过正则表达式查找一个或多个字母字符的行的最后一个元素push(对所需元素进行正向选择,而不是破坏性)。 [注意,这里是一个近似值,除了仅在空格上进行分割,因此仍然会在结果元素中留下标点符号]。[*-1]comb<alpha>+splitwordswords

一旦@a数组被填满(这里my @a.=push( … )脱糖至my @a = @a.push( … )),@a 的元素是unique-ified、flipped、sorted 和flipped back。

排序是通过例程/参数完成的.sort( *.fc.trans: "àèéìòù" => "aeeiou" ),这意味着*元素将根据已排序的字符进行排序。fc 折叠式以及六个带重音的字符trans"àèéìòù" => "aeeiou"。如果没有trans例程,以这六个重音字符结尾的单词将排序到列表的末尾。

输入示例:

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

示例输出:

pietà
fanno
affanno
scritto

我冒昧地测试了彼得罗·梅塔斯塔西奥(Pietro Metastasio)的另一首诗,题为自由。示例输出如下所示,但我.join(", ")在代码末尾添加了以返回逗号分隔的输出(而不是每行一个单词)。下面第一个答案致电trans: "àèéìòù" => "aeeiou",下面的第二个答案没有致电trans: "àèéìòù" => "aeeiou"

~$ perl6 -e 'my @a.=push: .comb(/<alpha>+/)[*-1] if .chars for lines; .put for @a.unique.map(*.flip).sort( *.fc.trans: "àèéìòù" => "aeeiou" ).map(*.flip).join(", "); put("");' file.txt
fa, ha, bella, quella, pena, catena, ragiona, sprona, ancora, talora, pietà, beltà, sciolta, volta, libertà, rinnova, prova, è, piace, spiace, infelice, Nice, ingannatrice, fé, me, penne, avvenne, core, ardore, colore, rossore, te, amante, incostante, fai, mai, guai, spezzai, dì, miei, sei, sdegni, segni, suoi, tuoi, così, dico, antico, parlando, dimando, umano, vano, sdegno, segno, hanno, sanno, dono, ragiono, sono, sincero, primiero, impero, altero, vero, aggiro, miro, curo, procuro, so, passò, appresso, oppresso, stesso, istesso, ingrato, prato, ascolto, volto, cimento, rammento, sento, contento, estinto, istinto, difetto, aspetto, consolar, parlar, sdegnar, trovar, piacer, pensier, soffrir, morir, cor, amor, favor

~$ perl6 -e 'my @a.=push: .comb(/<alpha>+/)[*-1] if .chars for lines; .put for @a.unique.map(*.flip).sort( *.fc ).map(*.flip).join(", "); put("");' file.txt
fa, ha, bella, quella, pena, catena, ragiona, sprona, ancora, talora, sciolta, volta, rinnova, prova, piace, spiace, infelice, Nice, ingannatrice, me, penne, avvenne, core, ardore, colore, rossore, te, amante, incostante, fai, mai, guai, spezzai, miei, sei, sdegni, segni, suoi, tuoi, dico, antico, parlando, dimando, umano, vano, sdegno, segno, hanno, sanno, dono, ragiono, sono, sincero, primiero, impero, altero, vero, aggiro, miro, curo, procuro, so, appresso, oppresso, stesso, istesso, ingrato, prato, ascolto, volto, cimento, rammento, sento, contento, estinto, istinto, difetto, aspetto, consolar, parlar, sdegnar, trovar, piacer, pensier, soffrir, morir, cor, amor, favor, pietà, beltà, libertà, è, fé, dì, così, passò

注意:由于所有标点符号都被删除,因此连字符连接的单词(如果有)在分析过程中会被拆分为组成词。

相关内容