忘れられた句読点の意味を見つける方法

忘れられた句読点の意味を見つける方法

サンプルファイルを入手

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

これは、レコード区切り文字を2つの改行文字シーケンスに設定します。これは、各段落が記録になることを意味します。レコードの最後のフィールド(単語)!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~が句読点(いずれか)で終わらない場合は、段落を印刷します。

代わりに、より適切な場合は、[[: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

デフォルトでは、一度に1行ずつ読み取るため動作grepしません。したがって、ラインアンカーの終わり以降、どの項目も一致grepすることは期待できません。$

答え2

解決策sed

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

これは標準の修正ですsed 'N;P;D'。 OPが試している元の正規表現を反映すると予想されますgrep

関連情報