Grep текстовый файл рекурсивно для фильтрации абсолютных путей - PullRequest
0 голосов
/ 25 июня 2019

У меня есть текстовый файл с большим количеством путей к файлам. Мне нужно извлечь все каталоги (исключая имена файлов и расширения) и сделать из него новый текстовый файл. Глубина каталогов может отличаться, метка диска также может отличаться.

Мне нужно сохранить дубликаты !!!

Не уверен, какой маршрут выбрать, поскольку глубина каталога сильно различается: awk, sed, grep

Input (sample.txt):
C:\lolz\yoloz\thisisit.txt
D:\Windows\Programs\Others\Hell\gate.exe
D:\Windows\Programs\Others\Hell\rain.exe
E:\Auto\Plane\Boat\transport.ini

Expected output:
C:\lolz\yoloz
D:\Windows\Programs\Others\Hell
D:\Windows\Programs\Others\Hell
E:\Auto\Plane\Boat

Ответы [ 4 ]

5 голосов
/ 25 июня 2019

Эта короткая строка работает для вашего текущего примера:

sed 's/\\[^\\]\+$//' sample.txt
0 голосов
/ 27 июня 2019
awk '{sub(/.{9}$/,"")sub(/\\t.?../,"")}1' file

C:\lolz\yoloz
D:\Windows\Programs\Others\Hell
D:\Windows\Programs\Others\Hell
E:\Auto\Plane\Boat
0 голосов
/ 25 июня 2019

Или чистый раствор Bash без внешнего инструмента

while read -r line || [[ ${line} ]]; do
  [[ ${line} =~ (.*)\\[^\\]* ]]
  echo "${BASH_REMATCH[1]}"
done
0 голосов
/ 25 июня 2019

Это сделало это для меня:

grep -o '[A-Z]\:[\\a-zA-Z0-9]*\\' sample.txt | sort  | uniq

Объяснение:
Начните с буквы диска: [A-Z], за которым следует двоеточие \:
Рядом с этим списокобратные косые черты, буквы и цифры [\\a-zA-Z0-9]*
Он должен заканчиваться обратной косой чертой, чтобы получить каталог \\

Видимо, чтобы это работало, вам нужны одиночные кавычки.

grep -o предназначен для фильтрации выходных данных grep.

sort | uniq предназначен для удаления дубликатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...