如何找到忘记标点符号的释义

如何找到忘记标点符号的释义

获取示例文件

this is line one of a paragraph
that continues here and finishes
with a full stop as it should.

Now we have a second paragraph
that continues in a new line, 
but the full stop is missing

I simply overlooked it, typing too fast.

我怎样才能检测到此类错误?我天真的 grep 方法

grep "^.*[a-zA-Z]$^$"  file.text

不是工作(为什么?)。

答案1

使用 GNU awk

$ awk -v RS='\n\n' '$NF !~ /[[:punct:]]$/' file
Now we have a second paragraph
that continues in a new line,
but the full stop is missing

这将记录分隔符设置为两个换行符的序列。这意味着每个段落都将成为一条记录。如果记录的最后一个字段(单词)不以标点符号( 之一!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)结尾,则打印该段落。

相反,[[:punct:]]您可以使用较小的字符类,[.!?]如果这样更合适的话。

如果您想在输出中包含段落编号以及一些装饰文本,请使用

$ awk -v RS='\n\n' '$NF !~ /[[:punct:]]$/ { printf("ERROR (%d):\n%s\n", FNR, $0) }' file
ERROR (2):
Now we have a second paragraph
that continues in a new line,
but the full stop is missing

你的grep不起作用,因为grep默认情况下一次读取单行。因此,您不能期望匹配$行锚点末尾之后的任何内容。

答案2

解决方案sed

sed -n 'N;/[A-Za-z]\n$/P;D' file

这是标准的修改sed 'N;P;D'。它期望反映OP正在尝试的原始正则表达式grep

相关内容