Начиная с 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
Использование 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
по умолчанию читает по одной строке за раз. Поэтому вы не можете ожидать совпадения с чем-либо после привязки конца строки $
.
Решение sed
:
sed -n 'N;/[A-Za-z]\n$/P;D' file
Это модификация стандарта sed 'N;P;D'
. Ожидается, что он отразит исходное регулярное выражение, которое OP пытается grep
.