サンプルファイルを入手
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
。