-1

Лог-файл Windows SyncToy содержит несколько тысяч строк вида:

ххх ... C:\ ZZZ. ххх ...

а также

ххх ... ззз \. ххх ...

где xxx может быть строкой, включающей любой печатный символ, включая пробелы и / или пробелы

и ZZZ может быть строкой включая любые печатаемые символы , включая пробела, обратные косые черты, число, альфа (любом случае),. характер, подчеркивание, эм-тире, ан-тире

Каждая строка всегда будет содержать строку zzz. как и выше, который может начинаться с символов C:\, за которыми следует строка неопределенной длины (но, скажем, максимум 256 символов) и заканчиваться символом a . персонаж; но он не всегда может начинаться с C:\, он может просто начинаться с некоторых печатаемых символов.

zzz всегда начинается с символа (столбца) 41

Как вы узнаете, C:\zzz. следует шаблону абсолютного пути к файлу под Windows (точнее 7) с завершающим . характер, но не всегда завершающий обратный слеш.

Таким образом, типичная строка будет:

Error: Cannot read from the source file Error: Cannot read from the source file AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-981944830-553675151-235582288-1001\. Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 

Другой будет:

Error: Cannot read from the source file C:\Users\zamenhof\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db. The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0x80070020) Copying C:\Users\zamenhof\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db to G:\gc\Users\zamenhof\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db 

Мое требование состоит в том, чтобы извлечь каждый полный путь из каждой строки. Таким образом, в первом примере выше, мой желаемый результат будет

AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-981944830-553675151-235582288-1001\.

а во втором:

C:\Users\zamenhof\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db.

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

Я знаком с простыми регулярными выражениями, но не могу найти способ создать те, которые мне нужны, с использованием grep (или sed, awk или любого другого наиболее подходящего инструмента) для извлечения строк, которые я хочу.

Файлы будут поступать из Win7, но, вероятно, будут манипулироваться в Linux. Доступны расширенные инструменты регулярных выражений.

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

1 ответ1

-1
[^\\]* (\S*\\\S*)

С помощью этого регулярного выражения выделенные части от удара текста будут включены в первую группу.

Ошибка: невозможно прочитать из исходного файла. Ошибка: невозможно прочитать из исходного файла AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-981944830-553675151-235582288-1001. В доступе отказано. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))

Ошибка: не удается прочитать из исходного файла C:\Users\zamenhof\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db. Процесс не может получить доступ к файлу, потому что он используется другим процессом. (Исключение из HRESULT: 0x80070020) Копирование C:\Users\zamenhof\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db в G:\gc\Users\zamenhof\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256. децибел

Объяснение: (более или менее скопированная / вставленная форма regex101.com)

[^\\]* Match zero or more characters, excluding the backslash
\\ matches the character \ literally
* Quantifier — Matches between zero and unlimited times, as many times as possible

(space) matches the character (space) literally

1st Capturing Group (\S*\\\S*)
\S* matches any non-whitespace character
* Quantifier — Matches between zero and unlimited times, as many times as possible
\\ matches the character \ literally
\S* matches any non-whitespace character
* Quantifier — Matches between zero and unlimited times, as many times as possible

Узнайте: чтобы поэкспериментировать с регулярными выражениями, вы можете воспользоваться веб-сайтами, такими как regex101.com или regexr.com.

Инструменты: Вы не упоминаете, какие инструменты вы собираетесь использовать, но вот пример perl :

perl -lane 'print $1 if /[^\\]* (\S*\\\S*)/' file.txt

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