grep -ril, один раз показать только верхний каталог

Не уверен, что существует готовое -решение, но если вы немного знакомы с Python, вы можете попробовать ics.py . Просто pip install ics, затем:

from ics import Calendar

md_template = """
### {start}
*{name}*: {desc}""" 

with open("basic.ics") as f:
   cal = Calendar(f.read())

print("## Calendar")
for e in sorted(cal.events):
    print(md_template.format(start=e.begin.humanize(), name=e.name,
                             desc=e.description))

2
02.12.2020, 15:32
2 ответа

Каталоги не соответствуют шаблонам содержимого; файлы делают. Кажется, вы спрашиваете, как получить каталоги файлов, соответствующие шаблону.

Удалите путь после первого компонента и убедитесь, что результат представлен в виде уникальных значений в отсортированном порядке, как вы указали

grep -ril "hello" | sed 's!/.*$!!' | sort -u

Замените sortна awk '!h[$0]++', если вы не хотите менять порядок результатов

5
18.03.2021, 22:45

Если вы хотите распечатать только каталог первого уровня, будет более эффективно выйти сразу после обнаружения первого совпадения в этом каталоге. Вы можете добиться этого, используя -q, который возвращает успех для сопоставления, в противном случае сбой, и в сочетании с -rон завершает работу сразу же, как только найдено совпадение.

for d in */; do grep -qri "hello" -- "$d" && printf "%s\n" "$d"; done

--используется для обозначения конца параметров, поэтому все, что следует за аргументами файла, защищает от любого каталога с именем -somethingи может интерпретироваться как параметр.

Если вы хотите, чтобы указанный выше forсоответствовал каталогам, начинающимся с ., рассмотрите возможность установки shopt -s dotglob, см. также это .

Если вам нужно удалить конечный /из вывода, вы можете использовать расширение параметра bash и вместо "$d"вывести "${d%/}".

6
18.03.2021, 22:45

Теги

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