获取示例文件
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
。