Команды SFK


    1        2        3        4        5        6        7        8        9        10    

Раздел 5. Search and Compare - Поиск и сравнение
deplist | dupfind | extract | find | hexfind | md5 | md5check | md5gento | ofind | pathfind | reflist | xfind | xfindbin | xhexfind |


Help:   Рус   |   Eng        Refer:   Рус   |   Eng  

Команда: extract

Извлечение текста из файлов с помощью подстановочных знаков и выражений

sfk extract dirName "/searchtext/totext/"

Извлечение данных из текстовых и двоичных файлов с помощью подстановочных знаков * и ? а также простые выражения SFK в скобках [].

Создает (двоичный) поток данных, который может быть:

  • - записан в терминал в виде шестнадцатеричного дампа (по умолчанию)
  • - записан в файл опцией -tofile
  • - отправлен в фиксированную цепочку команд +xed

    ПАРАМЕТРЫ

  • -nosub - не включать файлы в подкаталоги.

  • -nobin[ary] - пропустить бинарные файлы.

  • -case - сравнение текста с учетом регистра.
    Значение по умолчанию не учитывается.
    Для получения подробной информации введите: SFK Help NoCase

  • -text - Запускает список шаблонов поиска в форме /src/ или /src/totext/, где / — символ-разделитель, src — текст для поиска, а totext — маска для переформатирования вывода.
    Можно использовать любой символ-разделитель, который не является частью искомого текста, т.е. /foo/ или _foo_ оба ищут «foo».
    -text не требуется, если указано одно имя файла.

  • -pat - то же самое, что и -text, начиная со списка шаблонов

  • -bylist - x.txt чтение шаблонов поиска из файла x.txt, поддержка Несколько линий в шаблоне. (Добавьте -full, чтобы узнать больше.)

  • -bylinelist - Чтение шаблонов /from/to/ или просто /from/ из файла x с одним шаблоном в строке (для получения дополнительной информации добавьте -full).
    -by(line)list не поддерживает переменные sfk.
    Чтобы использовать переменные в шаблонах, создайте сценарий sfk с шаблонами в качестве параметров.
    «sfk-скрипт» для получения дополнительной информации.

  • -arc - XE: включить содержимое .zip .jar .tar и т.д. архивов как можно глубже, включая вложенные архивы.
    XD: demo прочитает первые 1000 байт каждой записи

  • -qarc - быстрое чтение архивов верхнего уровня, но не вложенных

  • -firsthit - показывать только первое найденное совпадение шаблона для каждого файла

  • -tracesel - подробно рассказать, какие файлы ищутся, а какие игнорируются

  • -quiet - не показывать информацию о прогрессе

  • -names - выводит только имена файлов, содержащих хотя бы одно попадание

  • -notnames - выводит только имена файлов, не содержащих ни одного хита

  • -justrc - не выводить результаты поиска, просто установить код возврата при обращениях

  • -full - полный текст справки, рассказывающий о -bylist pat.
    Файлы, чувствительность к регистру специальных символов и поведение вложенной или повторяющейся замены.

    Параметры вывода

  • -dump - создать шестнадцатеричный дамп поисковых совпадений или замененного текста

  • -wide - с -dump: показать 16 байт в строке

  • -lean - с -dump: показать 8 байт в строке

  • -dumpfrom - всегда выгружать поисковые совпадения, но не заменяемый текст

  • -dumpall - выгрузить искомый текст и заменяемый текст

  • -nodump - не создавать шестнадцатеричный дамп, выводить только совпадающие файлы

  • -astext - не шестнадцатеричный дамп, но вывод результатов поиска в виде обычного текста.
    Используйте его только с обычными текстовыми файлами, а не с двоичными

  • -showle - подсвечивать окончания строк CR/LF в шестнадцатеричном выводе дампа

  • -context=n - с шестнадцатеричным дампом: показать дополнительные n байт контекста

  • -reldist - с hexdump: определить относительные расстояния до предыдущих совпадений

  • -nofile - не вставлять строки заголовка :file в вывод

  • -crlf,-lf - для заголовков файлов и текста по умолчанию: принудительное окончание строк crlf или lf вместо системного значения по умолчанию.

  • -filehead s - заголовок файла s для вставки в каждый совпадающий файл.
    Можно использовать только [file.name], окруженный текстом.
    по умолчанию -filehead ":file [file.name]", если только выполняется поиск в одном файле.
    Не может быть использован с Xhexfind.
    Чтобы получить результат и имя в одной строке, используйте [file.name] в выражении, например:
    sfk xfind -pure -nofile mydir "/foo*bar/[file.name]: [all]\n/"

  • -sep s - определить разделитель s между совпадениями в файле

  • -to dir\$file - записать выходные файлы по указанному пути.
    Подробнее о масках выходного файла, введите "SFK Help Opt" или "SFK Run"

  • -tofile x - записать выходные данные в один выходной файл с именем x (которые не интерпретируется как маска, а воспринимаются как есть)

  • - +tofile x в качестве последнего параметра (цепочка команд):
    записать текст как он отображается на терминале в файл x

  • -more[n] - приостанавливать вывод каждые 30 или n строк

    Коды возврата для bat-файлов
    0 = совпадений нет,
    1 = совпадений найдено,
    >1 = произошла серьезная ошибка

    Смотрите также «SFK Help Opt» о том, как повлиять на обработку ошибок

    Многострочные параметры в кавычках поддерживаются в скриптах

    Использование полной обрезки. Введите "SFK script" для получения подробной информации

    Многострочные параметры в кавычках поддерживаются в скриптах
    Использование полной обрезки. Введите "SFK script" для получения подробной информации

    Подстановочные знаки и выражения SFK

    Выражения SFK - это простые шаблоны, содержащие буквенный текст, подстановочные знаки * и ? и классы символов в квадратных скобках [].

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

    Шаблоны поиска окружены символом-разделителем, которым может быть что угодно, не содержащееся в тексте поиска, например / или _.


    Внутри шаблона /fromtext/totext/ fromtext может содержать:

  • * - от 0 до 4000 символов в одной текстовой строке или абзаце, т.е. все байты, не имеющие значения CR, LF или NULL. 4000 — это просто максимум по умолчанию, который можно изменить следующим образом:

  • [0.100000 chars] - от 0 до 100 000 символов в одной текстовой строке или абзаце, т.е. то же, что *, но с большим диапазоном.

  • ? - один символ

  • ????? - то же, что [5,5 символов] или [5 символов]

  • [bytes] - от 0 до 4000 байт (с CR,LF,NULL), т.е. он собирает текст потока по строкам, даже в двоичных данных

  • [0.100 bytes] - от 0 до 100 байт

  • ** - то же, что [байты]

  • [.100000 bytes] - до 100000 байт

  • [1.* bytes] - от 1 до максимального количества байт по умолчанию

  • [2 chars] - ровно 2 символа

  • [30 bytes] - ровно 30 байт

  • [byte of aeiou] - одна гласная (OR A OR e OR...), по умолчанию нечувствителен к регистру. «aeiou» — это список символов

  • [byte of \\\x2f] - обратная косая черта \ или вперед. косая черта /

  • [bytes of \r\n \t] - пробелы, включая конец строки

  • [bytes of (\r\n \t)] - то же, () не обязательны

  • [bytes not \r\n\0] - до 4000 байт, пока не появится байт CR, LF или NULL.

  • [chars] - то же, что [байты не \r\n\0], т.е. собирать текст в строку

  • [char not ( \t)] - то же, что [byte not (\r\n\0\t)], все, кроме пробелов и табуляций

  • [char not )( \t] - без скобок, пробелов и табуляций, как и без (\(\) \t)

  • [chars of a-z0-9] - означает a-zA-Z0-9, поскольку поиск по умолчанию нечувствителен к регистру

  • [chars of \x61-\x7A] - ищите от a до z, но не от A до Z, или используйте опцию -case для поиска по регистру

  • [eol] - конец строки символами: CRLF или LF или CR

  • [white] - 0 или более пробелов

  • [xwhite] - то же, но через строки

  • [1 white] - 1 пробел

  • [digit] - 1 цифра

  • [digits] - 0 или более цифр

  • [hexdigit] - 1 шестнадцатеричная цифра

  • [hexdigits] - 0 или более шестнадцатеричных цифр

    Специальные ключевые слова, которые не считаются токенами:

    [skip] - в начале шаблона: такой текст пропускать полностью, не считать его поисковым совпадением.

    [keep] - искать также следующий текст, но сохранять его во входных данных, не потребляя его.

    [ortext] - foo[ortext] bar ищет слово foo или bar, [ortext] разрешен только между литералами. Якоря, не имеющие собственной длины:

    [start] - начало файла

    [end] - конец файла

    [lstart] - начало строки, т.е. start или CRLF или CR или LF

    [lend] - логический конец строки, т.е. eol или конец файла.
    Чтобы заменить концы строк, используйте вместо них [eol].

    Как найти или заменить специальные символы:

  • - для поиска или замены текста, содержащего литеральные символы * ? \ [ ] их необходимо экранировать, например \* \? \\ \[ \]

  • - ( ) экранируются только внутри списков символов, например \( \)

  • - для поиска или замены косой черты '/' введите \x2f или используйте другой символ вокруг текста/из текста, например _fromtext_totext_

  • - параметры с пробелами и нетривиальными символами должны быть заключены в двойные кавычки "", см. также раздел "О символах команд оболочки" ниже.

    Приоритеты расширения:

    (сначала самый высокий)

    Если две части поиска расположены рядом и один и тот же входной символ соответствует обеим, то применяются следующие приоритеты:

  • 5: начало, конец, lstart, одолжить
  • 4: буквальный текст, eol
  • 3: классы белого списка: байт, байт
  • 2: классы черного списка: нет символов, нет байтов
  • 1: простые подстановочные знаки: ?, *, **, байт, байты, символы.

    Это означает, что в "/[bytes]foo/" [bytes] перестанет собирать символы, как только будет найдено "foo", поскольку "foo" является литералом. При том же или более высоком приоритете правая сторона останавливает левую сторону.


    ToText может содержать:

  • [part 1] использует первую текстовую часть fromtext, например fromtext /*foo[.100 chars]bar*/ содержит части: 1 2 3 4 5

  • [part1] то же (пробел необязателен).

  • [parts 1,2,3] используйте части 1, 2 и 3.

  • [parts 1-10] используйте части с 1 по 10.

  • [strip(part1,\0)] использует часть 1, но удаляет нулевые байты, можно удалить только нулевые байты "\0".

  • [file.name] полное входное имя файла с путем

  • [file.relname] входное имя файла без пути

  • [file.path] путь к входному файлу

  • [file.base] имя файла без последнего расширения.

  • [file.ext] расширение имени входного файла

  • [all] использовать все части из fromtext.

  • [setvar name]...[endvar] установить переменную "name" с данными между setvar и endvar.

  • [getvar name] заполнить данные из переменной "name"

    Хотя якоря типа lstart, Lend считаются отдельной частью, их НЕ обязательно указывать в тексте.
    Это значит, что /[lstart]foo[lend]/bar/ просто изменяет слово «foo».

    Поддерживаемые шаблоны косой черты:

  • \t = TAB

  • \r = CR

  • \n = LF

  • \x00 = один байт с шестнадцатеричным кодом 00

  • \0 = короткая форма для \x00

  • \q = двойная кавычка

  • \\ = символ обратной косой черты \ сам по себе

  • \[ = открывающий символ скобки [

  • \] = закрывающий символ скобки ]

  • \* = буквенный символ звезды *

  • \? = буквенный вопросительный знак ?

  • \- = для использования литерала "-" в команде

    В многострочных файлах -bylist:
    \ = косая черта+пробел заменяется на один пробел

    Только в списках "char of" или "byte not":
    \( = для использования литерального символа "("

    \)= для использования литерального символа ")"

    Параметры выражений SFK

  • -showpart(s) - вывести номера деталей /from/, статистику диапазона и приоритетные точки расширения для каждой части.
    Выполняется автоматически, если требуемый текст /to/ не указан в команде.

  • -showbest - если шаблон /from/ ничего не находит, используйте это для посмотрите, сколько частей будет совпадать на данный момент и сколько байтов будет в каждой части. Якоря типа [lstart] могут иметь ненулевую длину при сопоставлении (CR)LF.

  • -showlist с -bylist, показать внутренний объединенный список, если команды распределены по нескольким строкам.

  • -showall - показать все вышеперечисленное.

  • -xmaxlen=n установить максимальную длину по умолчанию для команд в виде символов или байтов, например,
    -xmaxlen=10000 означает, что /foo*bar/ соответствует до 10 000 символов между foo и bar.
    Максимальная длина по умолчанию без этой опции составляет 4000 символов.

    Замечания по производительности

  • - всегда используйте строковый литерал, одиночный байт или символ в начале выражений поиска, например, /foo*bar/, начиная с 'f'.

  • - не используйте подстановочный знак, например *, в начале, как в /*foobar/, при поиске огромных входных данных ваш поиск замедлится в 256 раз.
    Вместо этого используйте /[lstart]*foobar/.

  • - система может кэшировать выходные файлы, записывая их на диск в фоновом режиме после завершения sfk. Последующие пакетные команды могут выполняться медленнее.

    Поддержка цепочки Выходные данные SFK Extract могут быть отправлены только на +XED или +xex.
    Другие команды требуют шага преобразования XED, например sfk extract ... +xed +view

    ПСЕВДОНИМЫ

    sfk xhexfind то же самое, что и xfind -hex

    Для извлечения неизмененных двоичных данных вы можете использовать sfk xfind -pure ... -tofile или

    sfk extract ... -tofile

    Поддержка файлов Office

    sfk ofind - Поиск в тексте содержимого файлов .xml из файлов Office, таких как .docx .xlsx .ods .odt.

    sfk help office - для получения дополнительной информации и опций

    СМОТРИТЕ ТАКЖЕ

    Команды с открытым кодом

    sfk xfind Поиск текста с подстановочными знаками в обычных текстовых файлах

    sfk ofind Поиск в файлах Office .docx .xlsx .ods

    sfk xfindbin Поиск текста с подстановочными знаками в текстовых/двоичных файлах

    sfk xhexfind Поиск в текстовом/двоичном файле с шестнадцатеричным выводом дампа

    sfk extract Извлечение данных с подстановочными знаками из текстовых/двоичных файлов

    sfk filter Фильтрация и редактирование текста с помощью простых подстановочных знаков

    sfk find Поиск фиксированного текста в текстовых файлах

    sfk findbin Поиск фиксированного текста в текстовых/двоичных файлах

    sfk hexfind Поиск фиксированного текста в двоичных файлах

    sfk replace Замена фиксированного текста в текстовых/двоичных файлах

    Бесплатные команды

    sfk view Инструмент с графическим интерфейсом для поиска текста по мере ввода

    XE коммерческие команды

    sfk replace Замените фиксированный текст на высокопроизводительный

    sfk xreplace Замена подстановочного знака в текстовых/двоичных файлах

    sfk help xe о SFK XE и xreplace на выражения SFK.

    Остерегайтесь командных символов оболочки.

    Чтобы найти или заменить текстовые шаблоны, содержащие пробелы или специальные символы, такие как <>|!&?*, вы должны добавить кавычки "" вокруг параметров, иначе среда оболочки уничтожит вашу команду. Например, шаблон /foo bar/other/ должен быть записан как «/foo bar/other/» в файле .bat или .cmd, процент % должен быть экранирован как %% даже в кавычках: sfk echo -spat «percent %» % — это процент \x25"

    О примерах чисел [со скобками]

    Если вы видите [1], введите «sfk cmd 1» для всей команды в одной строке.


    Плохие примеры с исправленииями:

    Если входной текст содержит:
    bool bClFoo;
    bool bClBar;

  • sfk xfind in.txt "/bool[xwhite]bCl*[xwhite];/"

    НЕ соответствует «bool bClFoo;» потому что * съедает всю строку ввода, включая ";" поэтому для "[xwhite];" не осталось ввода и все выражение терпит неудачу.

  • sfk xfind in.txt "/bool[xwhite]bCl[* not ;][xwhite];/"

    оба соответствуют «bool bClFoo;» и «bool bClBar ;». это означает, что всякий раз, когда ваш поиск не работает, подробно напишите, какие символы (не) где собирать.

  • sfk xex in.txt "/[lstart]foo/[lstart]goo/"

    нет необходимости писать якорь типа [lstart] внутри totext, поскольку он не содержит данных. Используйте вместо этого: sfk xex в.txt "/[lstart]foo/goo/"

  • sfk xex in.txt "/foo[lend]bar/goo[part2]bar/"

    Привязки типа [lend] должны находиться в начале или конце fromtext и на них нельзя ссылаться внутри totext.
    Используйте вместо этого: sfk xex in.txt "/foo[eol]bar/goo[part2]bar/"


    Рабочие примеры

  • sfk xfind -text "/class [bytes]{[bytes]}/[all]\n\n/"

  • -dir mydir -file .hpp +tofile out.txt Сбор определений классов из mydir и запись выходных данных опосредованно (через цепочку команд) на выход из .txt [13]

  • sfk extract in.txt -text "/foo*bar/" Поиск в .txt шаблонов, начинающихся с foo и заканчивая с bar, в той же строке, до 4000 символов между ними

  • sfk extract in.txt -text "/foo*bar/" +view То же самое, что и выше, но покажите результат в представлении Depeche Инструмент текстового браузера для удобства чтения

  • sfk xhex -text "/foo[0.100000 bytes]bar/" -dir mydir Поиск во всех текстовых и двоичных файлах mydir на наличие шаблонов foo и bar от 0 до 100000 байт (включая NULL, CR и LF) и вывести вывод в виде шестнадцатеричного дампа

  • sfk extract -text "/printf(**);/" -dir mydir -file .cpp Найдите все операторы printf в исходном коде, включая операторы по нескольким строкам

  • sfk extract in.txt "/foo[0.100 chars of (a-z0-9_@ )]bar/" извлекает из одного входного файла в .txt все фразы начальная foo и конечная строка, в одной строке, с помощью от 0 до 100 символов между буквенно-цифровыми или один из символов @ _ или пустой символ

  • sfk sel mydir .txt +extract "/foo*bar/" Извлеките foo*bar из всех файлов .txt в mydir

  • sfk extract mydir "/\x66\x6f\x6f[0.100 bytes]\x62\x61\x72/" -tofile out.dat найти двоичные данные, начинающиеся с байтов 0x66, 0x6f, 0x6f, заканчивающиеся на 0x62, 0x61, 0x72 и до 100 байт между ними. Во всех файлах папки mydir, записывая найденные данные в один файл out.dat

  • sfk extract -text "/class [bytes]{[bytes]}/[all]\n\n/" -tofile out.txt -dir mydir -file .hpp Сбор определений классов из Mydir непосредственно в Out.txt [10]

  • sfk extract -dir mydir -file .cpp -text "/printf([bytes]);/[all]\n/" +xed "/);[eol]/[all]/" "/[eol][1.* white]/ /" извлечь все (многострочные) операторы printf из исходного кода, Преобразуйте многострочный в однострочный, удаляя пробелы. [11] "/); [eol]/[all]/" сохраняет все окончания строк после ");"

  • sfk extract -text "/$version:vernum=*,*name=*,*os=*, [file.name]: [part6] v[part2] for [part10]\n/" -tofile versions.txt -dir mydir -file .exe -nofilenames Поиск всех файлов .exe в mydir для текстового блока, такого как $version:vernum=1.6.9,name=fooprog,os=windows затем извлечь и переформатировать информацию о версии и запись результатов без заголовков :file в versions.txt [12]

  • sfk extract in.zip "/PK\x05\x06[0.100 bytes]/" ищем символы 'P','K', затем байты 0x05 0x06 а затем до 100 байт в необработанных сжатых данных файла .zip без извлечения содержимого

  • sfk extract -arc in.zip "/class*/"
    XE: найдите фразы, начинающиеся с "class" в содержимом .zip
    XD: демонстрация будет искать первые 1000 байт в подфайле .zip