Используя grep, затем sed:
grep --no-group-separator -B 1 "italic" <yourfilename> | sed -n 1~2p`
Explanation:
grep manual:
-B num --before-context=num Вывести num строк ведущего контекста перед совпадающими строками --no-group-separator Когда используются -A, -B или -C, не печатать разделитель между группами строк.
sed:
Выберите первую строку из двух. Мы также можем поставить sed -n 1~5p для выбора первой из пяти.
Ваша команда
find ~ -path "/home/user/sandboxes/*" -prune -o -name 'some-file.vmdk'
печатает
/home/user/sandboxes/debian7.amd64.buildd
/home/user/sandboxes/debian9.amd64.buildd
, потому что действие по умолчанию, когда никакое действие не указано, заключается в выводе найденных путей. Вышеупомянутые пути найдены, а затем эти пути обрезаны. Сокращение пути поиска не исключает возможность печати этих имен путей.
Однако, если вы добавите -print
в самый конец, как в
find "$HOME" -path "$HOME/sandboxes" -prune -o -name 'some-file.vmdk' -print
тогда эти пути будут не напечатаны. Это потому, что теперь у вас есть явное действие (и -print
), поэтому никакие действия по умолчанию не запускаются. -print
относится только к правой части -o
.
Обратите внимание, что *
не требуется, и что с переменной $HOME
легче работать, чем с ~
, особенно в сценариях.
Ваша первая команда,
find ~ -not -path "~/sandboxes/*" -name 'some-file.vmdk'
, скорее всего, не работает, так как ~
не заключен в кавычки.
Предполагая, что вместо этого вы использовали $HOME
, он также не сокращает путь поиска, что означает, что он по-прежнему будет вводить ~/sandboxes
, но никогда не будет печатать имена путей из-под этого пути. Поскольку он входит в каталог, он все равно будет выдавать вам ошибки разрешения, когда он достигает недоступных каталогов.
Можно попробовать так:
find ~ \! -path "*/sandboxes/*" -name 'some-file.vmdk'
Или с -черносливом:
find ~ -path "*/sandboxes" -prune -o -name 'some-file.vmdk'
но не могу найти способ удалить печать ~/песочницы