как найти парафрафы с забытой пунктуацией

Начиная с moreutils 0.31 %. Доступен спецификатор S , используйте его вместо% S:

ping google.com | ts '%Y%m%d-%H:%M:%.S'
20160327-15:01:11.361885 PING google.com (216.58.209.206) 56(84) bytes of data.
20160327-15:01:11.362056 64 bytes from bud02s22-in-f206.1e100.net (216.58.209.206): icmp_seq=1 ttl=57 time=26.3 ms
20160327-15:01:12.314243 64 bytes from bud02s22-in-f206.1e100.net (216.58.209.206): icmp_seq=2 ttl=57 time=26.2 ms
20160327-15:01:13.315651 64 bytes from bud02s22-in-f206.1e100.net (216.58.209.206): icmp_seq=3 ttl=57 time=26.3 ms
2
02.05.2019, 20:43
2 ответа

Использование GNUawk:

$ 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по умолчанию читает по одной строке за раз. Поэтому вы не можете ожидать совпадения с чем-либо после привязки конца строки $.

1
27.01.2020, 22:17

Решение sed:

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

Это модификация стандарта sed 'N;P;D'. Ожидается, что он отразит исходное регулярное выражение, которое OP пытается grep.

0
27.01.2020, 22:17

Теги

Похожие вопросы