2

У меня есть очень длинный файл, содержащий пути к файлам, по одному в каждой строке. Я хотел бы получить список всех каталогов в списке, которые только 1-го уровня. Таким образом, я хотел бы извлечь только те строки, которые имеют один / в них:

Я хочу: ./somedir
Я не хочу: ./somedir/someotherdir

Могу ли я сделать это с помощью grep и / или регулярных выражений?

2 ответа2

5

Конечно. Это довольно просто:

find . | grep -P '^\./[^/]*$'

... где, очевидно, команда 'find', которую я использую, просто для иллюстрации того, что вы описали. Регулярное выражение работает следующим образом:

  • ^ и $ являются якорями, указывающими (соответственно) начало и конец строки. Все содержимое должно быть между этими двумя персонажами
  • \./ - буквальный период, за которым следует буквальная косая черта
  • [^] это класс символов, который запрещает что-либо после ^ и до ]
  • Знак * после [^/] говорит, что разрешено ноль или более вхождений этого класса символов

Вы также можете сделать это так:

dosomething | grep -P '^[^/]*/[^/]*$'

Это позволит только один / в строке, в любой позиции в строке (даже первый или последний символ).

2

Решение @Brians работает, это более общее решение, которое не нуждается в ./ в начале:

grep -P '^[^/]*/[^/]*$'

Например:

/aa/somedir
test/somedir/someotherdir
somedir/otherdir

--> somedir/otherdir

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .