Добавить строку под каждой строкой, соответствующей шаблону, только если она еще не указана

Если вам нужны только обычные файлы,

С GNU найдите :

find . -maxdepth 1 -type f -printf . | wc -c

Другое найдите s:

find . ! -name . -prune -type f -print | grep -c /

( вам не нужен -print | wc -l , поскольку это не сработает, если есть имена файлов с символами новой строки).

С zsh :

files=(*(ND.)); echo $#files

С ls :

ls -Anq | grep -c '^-'

Чтобы включить символические ссылки на обычные файлы, измените -type f на -xtype f с помощью GNU find или -exec test -f {} \; с другими find или . с -. с помощью zsh или добавьте параметр -L в ls . Однако обратите внимание, что вы можете получить ложноотрицательных в случаях, когда тип цели символической ссылки не может быть определен (например, потому что он находится в каталоге, к которому у вас нет доступа).

Если вам нужен файл любого типа (символическая ссылка, каталог, каналы, устройства ...), а не только обычный:

find . ! -name . -prune -printf . | wc -c

(измените на -print | grep -c / с не- GNU найти , (ND.) до (ND) с zsh , grep -c '^ -' с wc -l с ls ).

Однако это не будет учитываться . или .. (как правило, никто особо не заботится о них, поскольку они всегда там), если вы не замените -A на -a на LS .

Если вам нужны все типы файлов, кроме каталогов, замените -тип f на ! -type d (или ! -xtype d , чтобы также исключить символические ссылки на каталоги), а с помощью zsh заменить . на ^ / и на ls , замените grep -c '^ -' на grep -vc '^ d' .

Если вы хотите исключить скрытые файлы, добавьте ! -name '. *' или с помощью zsh , удалите D или с помощью ls , удалите A .

3
24.06.2016, 12:41
2 ответа

Это выражение perl поможет,

perl -i -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss

Пояснение

  • далее, если / apache 4.2 / пропускает любые строки, соответствующие apache 4.2 .
  • s + Os версия rhel5.6 + Os версия rhel5.6 \ napache 4.2+; print search Os version rhel5.6 и заменяет строку такой же с добавлением apache 4.2 в новую строку.

Проверьте исходный файл

$ cat ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

$ perl -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2
2
27.01.2020, 21:18

Вот один из способов сделать это с помощью sed :

sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile

Это добавляет apache 4.2 безусловно для всех строк, соответствующих Os версии rhel5.6 , затем (если не в последней строке) он вставляет следующую строку через n (печать пространства шаблонов) и если новое содержимое пространства шаблонов совпадает с apache 4.2 , оно удаляется. При необходимости отрегулируйте регулярное выражение, чтобы включить начальные / конечные пробелы, например. / ^ [[: blank:]] * apache 4 \ .2 [[: blank:]] * $ / d

2
27.01.2020, 21:18

Теги

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