对于给定的文本文件,我想将每个句子中的最后一个单词提取到以空格分隔的文本文件中。对于像Mr.和Dr.这样的单词有一些错误是可以接受的,所以我不需要尝试达到这样的精确度。
我以为我可以用Sed和Awk这样做,但是因为我和他们一起工作太久了,我不记得从哪里开始。帮助
(输出示例:对于前两段,我希望看到这一点):
file Mr Dr precision begin Help
答案 0 :(得分:2)
使用此正则表达式:
([[:alpha:]]+)[.!?]
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
代表“全局” - 它会记住上次匹配发生的位置并尝试匹配。