如果最后一个字母是“r”,则打印最后一个单词

如果最后一个字母是“r”,则打印最后一个单词

例如,如果一行的最后一个字母是 ,我如何打印最后一个单词r

I am reading the book
I am reading the letter

结果:

letter

我使用 bash linux,问候

答案1

$ awk '/r$/ { print $NF }' file
letter

这用于awk测试每行是否以字符结尾r。该测试是使用正则表达式 进行的r$。仅当最后一个字符是 时,此表达式才匹配r。如果匹配,则$NF打印最后一个空格分隔的字段 , 。

请注意,这假设行末尾没有尾随空格,并且“单词”是指由某些空格分隔的任何字符串。


使用sed

$ sed -e '/r$/!d' -e 's/.* //' file
letter

这首先会跳过任何不以 an 结尾的行r(这是第一个表达式)。然后,它使用替换命令删除所有剩余行上直到并包括最后一个空格字符的所有内容。然后输出剩下的内容。

同样,这假设任何行上都没有尾随空格字符,并且“单词”是由空格分隔的任何字符串。


使用rev++ (我并不是认真建议你使用它)cutgrep

$ rev file | cut -d ' ' -f 1 | rev | grep 'r$'
letter

这使用非标准实用程序反转每条单独的行rev。然后,它使用 提取第一个空格分隔的字符串cut,并将结果单词反转为其原始顺序。然后,该实用程序使用熟悉的正则表达式grep提取以 结尾的任何单词。r

答案2

使用(以前称为 Perl_6)

~$ raku -ne '.words.[*-1] andthen .put if .grep(/ r $ /);'  file

或者

~$ raku -ne '$_ = .words.[*-1]; .put if .grep(/ r $ /);'  file

您可能需要考虑使用 Perl 系列语言来解决此问题。使用上面的 Raku,使用-ne非自动打印标志逐行读取输入文件。输入被分解(即在空格上分解),并保留words最后一个元素(即单词) 。.[*-1]在第一个示例中,andthen用于将最后一个单词重新加载到$_Raku 的主题变量中。在第二个示例中,$_只是简单地赋值.words.[*-1]

grep如果发现与正则表达式匹配,则从这里简单返回整个单词/ r $ /。注意:Raku 正则表达式中通常可以容忍空格,从而使它们更具可读性。

输入示例:

I am reading the book
I am reading the letter

示例输出:

letter

Raku 链接如下,包括word定义。

https://docs.raku.org/routine/words
https://docs.raku.org/language/regexes
https://raku.org

相关内容