如何提取句子的最后一个单词

时间:2016-03-07 15:08:43

标签: awk sed

对于给定的文本文件,我想将每个句子中的最后一个单词提取到以空格分隔的文本文件中。对于像Mr.和Dr.这样的单词有一些错误是可以接受的,所以我不需要尝试达到这样的精确度。

我以为我可以用Sed和Awk这样做,但是因为我和他们一起工作太久了,我不记得从哪里开始。帮助

(输出示例:对于前两段,我希望看到这一点):

file Mr Dr precision begin Help

4 个答案:

答案 0 :(得分:2)

使用此正则表达式:

([[:alpha:]]+)[.!?]

Explanation

Grep可以做到这一点:

$ echo "$txt" | grep -o -E '([[:alpha:]]+)[.!?]'
file.
Mr.
Dr.
precision.
begin.
Help?

然后,如果你只想要这些单词,第二次通过:

$ echo "$txt" | grep -o -E '([[:alpha:]]+)[.!?]' | grep -o -E '[[:alpha:]]+'
file
Mr
Dr
precision
begin
Help

在awk中,同样的正则表达式:

$ echo "$txt" | awk '/[[:alpha:]]+[.!?]/{for(i=1;i<=NF;i++) if($i~/[[:alpha:]]+[.!?]/) print $i}'

Perl,同样的正则表达式,允许捕获组,也许更直接的语法:

$ echo "$txt" | perl -ne 'print "$1 " while /([[:alpha:]]+)[.!?]/g'
file Mr Dr precision begin Help

使用Perl,refine the regex更容易区分所捕获的单词:

echo "$txt" | perl -ne 'print "$1 " while /([[:alpha:]]+)(?=[.!?](?:(?:\s+[[:upper:]])|(?:\s*\z)))/g'
file precision begin Help

答案 1 :(得分:2)

GAWK:

$ gawk -v ORS=' ' -v RS='[.?!]' '{print $NF}' w.txt
file Mr Dr precision begin Help

(请注意,普通awk不支持将正则表达式分配给RS。)

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r 's/^[^.?!]*\b(\w+)[.?!]/\1\n/;/\n/!d;P;D' file

每行一个字或使用粘贴一行,所以:

sed -r 's/^[^.?!]*\b(\w+)[.?!]/\1\n/;/\n/!d;P;D' file | paste -sd' '

对于另一种使用sed的解决方案:

sed -r 'H;$!d;x;s/\n//g;s/\b(\w+)[.?!]/\n\1\n/g;/\n/!d;s/[^\n]*\n([^\n]*)\n/ \1/g;s/.//' file

答案 3 :(得分:0)

Perl很容易:

perl -ne 'print "$1 " while /(\w+)[.!?]/g'
  • -n逐行读取输入。
  • \w匹配“字符”。
  • \w+匹配一个或多个单词字符。
  • [.!?]匹配任何句末标记。
  • /g代表“全局” - 它会记住上次匹配发生的位置并尝试匹配。