Подсчет строк без текста в файле

POSIXly, Вы могли сделать:

find . -name '*.[jJ][pP][gG]' -exec sh -c '
  for i do
    [ -e "${i%.*}.pdf" ] || printf "%s\n" "$i"
  done' sh {} +

Если бы Вы хотите искать файлы PDF нечувствительно к регистру, Вы сделали бы:

find . -name '*.[jJ][pP][gG]' -exec sh -c '
  for i do
    set -- "${i%.*}".[pP][dD][fF]
    case $1 in
      (*"]") printf "%s\n" "$i"
    esac
  done' sh {} +
5
09.02.2014, 10:50
2 ответа

Ваша система должна иметь GNU grep, который имеет опцию -P для использования выражений Perl и можно использовать это, объединенное с -c (так никакая потребность в wc -l):

grep -Pvc '\S' somefile

'\S' вручает шаблон \S к grep и соответствиям вся строка, содержащая что-либо, что не является пространством, -v выбирает все другие строки (те, которые только имеют пространство), и -c считает их.

Из страницы справочника для grep:

-P, --perl-regexp
       Interpret  PATTERN  as  a  Perl  regular  expression  (PCRE, see
       below).  This is highly experimental and grep  -P  may  warn  of
       unimplemented features.

-v, --invert-match
       Invert the sense of matching, to select non-matching lines.  (-v
       is specified by POSIX.)

-c, --count
       Suppress normal output; instead print a count of matching  lines
       for  each  input  file.  With the -v, --invert-match option (see
       below), count non-matching lines.  (-c is specified by POSIX.)
8
27.01.2020, 20:34
  • 1
    Если Вы не хотите использовать 'очень экспериментальное' -P или не имейте гну grep, затем grep -Ec '^[[:space:]]*$' somefile должен работать (работы тот же путь). Я имею +1'd так или иначе как, у кого нет гну grep в эти дни... спасибо –  abligh 09.02.2014, 14:46
  • 2
    @abligh, MacOS, *BSD, propietary Нельды... –  vonbrand 09.02.2014, 16:36
  • 3
    Уверенный (вот почему я дал альтернативу). OS X grep действительно имеет -P и сделал начиная с (по крайней мере) 10,6. –  abligh 09.02.2014, 18:19

Можно использовать grep для него:

$ grep -c '^[     ]*$' somefile

где ^/$ соответствуйте запущению/заканчиванию строки и [ ] указывает класс символов, который включает пробелы и символы табуляции. * обозначьте 0 к неограниченным повторениям левой стороны.

-c опция говорит grep считать строки, соответствующие шаблону - вместо того, чтобы печатать их к терминалу.

Отметьте это на zsh Я должен поразить Ctrl+VTab для ввода литерального символа табуляции.

(a [ \t] не распознан grep)

3
27.01.2020, 20:34
  • 1
    Лично, я нахожу решение Timo намного более чистым. Это требует, чтобы Вы ввели те символы вручную. Но вот +1! –  Amal Murali 09.02.2014, 17:39
  • 2
    @AmalMurali, это - вопрос вкуса, конечно - но возможно не все знакомы (или хочет быть знакомым) со всеми regex расширениями Perl... (для не разговора о grep версиях без -P поддерживайте...) –  maxschlepzig 09.02.2014, 18:48

Теги

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