addhead | addtail | count | difflines | filter | head | joinlines | linelen | load | ofilter | perline | printloop | replace | run | runloop | snapto | sort | strings | tail | xed | xex | xreplace | Команда: xex sfk ... +xex /от/ [/от2/] потоковый текстовый фильтр с использованием простых выражений SFK. - берет ввод текстового потока из предыдущей команды или один файл. - объединяет все строки в один большой блок, который можно искал полностью. - снова разбивает вывод на строки для дальнейшего использования, или передает вывод как двоичный +xed xed/xex предназначен для постобработки небольших и средних файлов. потоки данных или файлы. не подходит для редактирования больших файлов более 100 МБ, так как весь контент должен помещаться в память много раз. используйте "sfk xreplace" для обработки больших файлов. подстановочные знаки и выражения SFK Выражения SFK — это простые шаблоны, содержащие буквенный текст, подстановочные знаки * и ? и классы символов в квадратных скобках []. в основном синтаксис предоставляет расширенные подстановочные знаки, но не дальнейшая логика и не связана с регулярными выражениями. шаблоны поиска окружены символом-разделителем, который может быть что угодно, не содержащееся в тексте поиска, например / или _ внутри шаблона /fromtext/totext/ fromtext может содержать: * - от 0 до 4000 символов в том же текстовая строка или абзац, т.е. все байты не являются CR, LF или NULL. 4000 это просто максимум по умолчанию который можно изменить: [0,100000 символов] — от 0 до 100000 символов в том же текстовая строка или абзац, т.е. то же, что *, но с большим диапазоном. ? - один персонаж. ????? - то же, что и [5,5 символов] или [5 символов] [байты] - от 0 до 4000 байт (с CR,LF,NULL) т.е. он собирает текст потока через строки, даже в двоичных данных ** - то же, что и [байт]. [0,100 байт] - от 0 до 100 байт [.100000 байт] - до 100000 байт [1.* байт] - 1 для максимального количества байтов по умолчанию [2 символа] - ровно 2 символа [30 байт] - ровно 30 байт [байт aeiou] - один вокал (а ИЛИ А ИЛИ э ИЛИ...), по умолчанию нечувствителен к регистру. "aeiou" - это список символов. [байт \\\x2f] - обратная косая черта \ или вперед. косая черта / [байты \r\n \t] - пробелы вкл. линия заканчивается [bytes of (\r\n \t)] - то же самое, () необязательны [байты не \r\n\0] - до 4000 байт, если нет Появляется байт CR, LF или NULL [символы] - то же, что и [байты не \r\n\0], т.е. собрать текст в строку [символ не ( \t)] - то же, что и [байт не ( \r\n\0\t)], все не пробелы и вкладки [char not )( \t] - не скобки, пробелы и табуляции, то же, что и не (\(\) \t) [символы a-z0-9] - означает a-zA-Z0-9, так как поиск по умолчанию нечувствителен к регистру [символы \x61-\x7A] - искать az, но не AZ, или использовать option -case для поиска случая [eol] - конец строки по символам: CRLF или LF или CR [белый] = символы (\t ) - 0 или более пробелов [xwhite] = байты (\t \r\n) - то же самое, но через строки [1 белый] = байт (\t) - 1 пробел [цифра] = байт (0-9) - 1 цифра [цифры] = байты (0-9) - 0 или более цифр [hexdigit] = байт (0-9a-f) - 1 шестнадцатеричная цифра [hexdigits] = байты (0-9a-f) - 0 или более шестнадцатеричных цифр специальные ключевые слова, которые не считаются токенами: [пропустить] - в начале паттерна: пропустить такой текст полностью, не засчитывайте это как поисковый запрос. [keep] - искать также следующий текст, но сохранить его во входных данных, не потребляя их. [ortext] - foo[ortext]bar ищет слово foo или bar. [ortext] допускается только между литералами. якоря, не имеющие собственной длины: [старт] - начало файла [конец] - конец файла [lstart] - начало строки, т.е. start или CRLF или CR или LF [lend] - конец логической строки, т.е. eol или конец файла. для замены концов строк используйте вместо этого [eol]. как искать или заменять специальные символы: - для поиска или замены текста, содержащего буквенные символы * ? \ [ ], то они должны быть экранированы как \* \? \\ \[ \] - ( ) экранируются только внутри списков символов, например \( \) - для поиска или замены косой черты '/' введите \x2f или используйте другой символ из/в текст, например _fromtext_totext_ - параметры с пробелами и нетривиальными символами нужно удваивать кавычки "", см. также "о командных символах оболочки" ниже. приоритеты расширения: (сначала самые высокие) если две части поиска находятся рядом, и один и тот же вход соответствует обоим, то применяются следующие приоритеты: 5: начало, конец, lstart, кредит 4: буквальный текст, эол 3: классы белого списка: байты, байты 2: классы черного списка: нет символов, нет байтов 1: простые подстановочные знаки: ?, *, **, байт, байты, символы это означает, что в "/[bytes]foo/" [bytes] перестанут собираться символов, как только будет найдено "foo", так как "foo" является литералом. при том же или более высоком приоритете правая сторона останавливает левую сторону. тотекст может содержать: [часть 1] используйте первую текстовую часть исходного текста. например, fromtext /*foo[.100 chars]bar*/ содержит части: 1 2 3 4 5 [part1] то же самое (пробел необязателен). [части 1,2,3] используйте части 1, 2 и 3. [части 1-10] используйте части с 1 по 10. [strip(part1,\0)] использовать часть 1, но удалить нулевые байты. можно удалить только нулевые байты "\0". [file.name] полное входное имя файла с путем [file.relname] введите имя файла без пути [file.path] путь к входному файлу [file.base] relname без последнего .extension [file.ext] введите расширение имени файла [all] использовать все части fromtext. [setvar name]...[endvar] установить переменную "name" с данными между сетвар и эндвар. [имя getvar] заполнить данные из переменной "имя" хотя анкоры вроде lstart, lend считаются отдельной частью их НЕ нужно указывать в тотексте. это означает, что /[lstart]foo[lend]/bar/ просто меняет слово "foo". поддерживаемые шаблоны косой черты \т = ТАБУЛЯЦИЯ \ г = КР \n = НЧ \x00 = один байт с шестнадцатеричным кодом 00 \0 = краткая форма для \x00 \q = двойная кавычка " \\ = сам символ обратной косой черты \ \[ = символ открытия скобки [ \] = символ закрытия скобки ] \* = буквальный символ звезды * \? = буквальный вопросительный знак ? \- = использовать литерал "-" в команде В многострочных файлах -bylist: \ = косая черта + пробел заменяется на один пробел Только в списках "char of" или "byte not": \(= использовать буквенный символ "(" \) = использовать буквенный символ ")" Параметры выражения SFK -showpart(s) печатать /из/ номеров деталей, статистику ассортимента и очки приоритета расширения за часть. делается автоматически, если требуется /to/ текст не дается с командой. -showbest, если шаблон /from/ ничего не находит, используйте это для посмотреть, сколько частей будет соответствовать до сих пор, и с до того, сколько байтов на часть. якоря типа [lstart] может показывать ненулевую длину при сопоставлении (CR)LF. -showlist с -bylist, показать внутренний объединенный список, если команды распределены по нескольким строкам. -showwall показать все вышеперечисленное. -xmaxlen=n установить максимальную длину по умолчанию для символьных или байтовых команд, например -xmaxlen=10000 означает, что /foo*bar/ соответствует до 10000 символов между foo и bar. макс по умолчанию длина без этой опции составляет 4000 символов. заметки о производительности - всегда используйте строковый литерал, или один байт, или символ, в начале ваших поисковых выражений, например, /foo*bar/, начиная с 'f'. Не используйте подстановочный знак, например *, в начале, как в /*foobar/ при поиске огромных входных данных, так как ваш поиск замедлится на коэффициент 256. Вместо этого используйте /[lstart]*foobar/. - система может кэшировать выходные файлы, записывая на диск в фоновом режиме после завершения sfk. последующие пакетные команды могут выполняться медленнее. опции -case сравнение с учетом регистра, по умолчанию нет регистра. для дополнительных опций см.: sfk help nocase -bylist x читать шаблоны /из/в/ из файла x, поддержка нескольких строк в шаблоне. для подробностей введите: sfk rep -full -bylinelist x читать /от/к/ или только /от/шаблоны из файла с одним шаблоном в строке. лучше всего подходит для поиска многих фраз с простое переформатирование вывода или его отсутствие. -i обрабатывать текстовый поток из стандартного ввода -tolines принудительно выводить в виде текстовых строк. использовать это если вы получаете неожиданные шестнадцатеричные данные. -nomark не выделять изменения в выводе -nocol вообще не содержит цветов, чтобы освободить больше памяти -write, если задано имя входного файла, перезаписать файл с измененными данными. производит пустой файл, если шаблоны поиска не найдены. -tofile f записать вывод в файл f. не используйте +tofile цепочки, поскольку он разбивает данные на текстовые строки. -rawterm при выводе на терминал не сбрасывать коды ниже 32. Нулевые байты всегда удаляются. -dump[raw] создать шестнадцатеричный дамп [raw = без подсветки eol] -crlf, -lf для заголовков файлов и текста по умолчанию: принудительно окончания строки crlf или lf вместо значения по умолчанию -justrc ничего не выводить, просто установить код возврата. -firsthit использовать только первый совпадающий результат. поддержка цепочки ввода/вывода извлечь ... +xed поддерживает передачу двоичных данных. xed ... +xed поддерживает передачу двоичных данных. Во всех остальных случаях как xed ... + данные фильтра передаются в виде текстовых строк без нулевых байтов и до 4000 символов за строку. Двоичная передача требует в четыре раза больше свободной памяти доступно, то фактическое количество переданных байтов. неожиданные шестнадцатеричные данные с фиксированной цепочкой если вы используете xed и получаете неожиданный шестнадцатеричный вывод например 746573746... это означает следующую команду не может обрабатывать потоковые данные. тогда используйте опцию -tolines. неожиданные разрывы строк с +tofile произойдет, если строки длиннее 4096 символов. вместо этого используйте -tofile. произойдет, если данные содержат символы возврата каретки. добавьте "/\r//", чтобы удалить их. смотрите также sfk swap изменить порядок символов в одной строке поддержка веб-доступа извлечение раздела заголовка с веб-страницы может быть выполнено следующим образом: sfk xex http://192.168.1.100/ "_<head>**</head>_" sfk xex http://.100/ "_<head>**</head>_" sfk web .100 +xex "_<head>**</head>_" чтение архивного файла xed может напрямую читать записи архивных файлов, например src.zip\\sub1.bz2\\sub2.tar.gz. для деталей и ограничения типа "sfk help xe". остерегайтесь командных символов оболочки. для поиска или замены текстовых шаблонов, содержащих пробелы или специальные такие символы, как <>|!&?*, вы должны добавить кавычки "" вокруг параметров или среда оболочки уничтожит вашу команду. Например, шаблон /foo bar/other/ должен быть написан как "/foo bar/other/" в файле .bat или .cmd процент % должен быть экранирован как %% даже в кавычках: sfk echo -spat "процент %% - это процент \x25" неожиданное поведение повторной замены в зависимости от входных данных и выражений поиска/замены, может случиться так, что одна и та же замена выполняется несколько раз в том же потоке производит новые хиты, которых не было в первом прогоне. прочитать sfk заменить расширенный текст справки на «sfk replace -full» для деталей. многострочные параметры в кавычках поддерживаются в скриптах с использованием полной отделки. введите "скрипт sfk" для деталей. коды возврата для пакетных файлов 0 = совпадений нет, 1 = совпадения найдены, >1 = произошла серьезная ошибка. см. также "sfk help opt" о том, как повлиять на обработку ошибок. о примерах номеров с [скобками] если вы видите [1], введите «sfk cmd 1» для всей команды в одной строке. веб-ссылка http://stahlworks.com/sfk-xex больше в Книге СФК Книга SFK содержит учебник на 60 страниц, в том числе подробные фиксированные примеры с вводом, скриптом и выводом. введите "книга sfk" для деталей. Примеры Примечание: см. также "sfk xed" для получения дополнительных примеров. sfk xex in.txt "_foo*bar_[part2]\n_" извлечь любой текст, найденный в пределах одной строки между foo и bar, используя вместо символа-разделителя "_" из "/". вы можете опустить третий "_", чтобы получить информационный текст с номерами деталей. sfk xex in.txt "_\qfoo\q[0,100 байт]\qbar\q_[все]\n_" извлечь любой текст, начинающийся с «foo», заключенный в двойной кавычки, то имеющие до 100 байт (включая CR или LF, т.е. через несколько строк текста), затем заканчивается чертой в двойных кавычках и выведите все части. sfk xex in.cpp "/printf([байты]);/[все]\n/" +xed "/);[eol]/[all]/" "/[eol][.100 байт \x20]/ /" собрать все (многострочные) операторы printf из текста и переформатировать их как один оператор в строке. уведомление что "/);[eol]/[all]/" является обложкой, что означает это ничего не меняет, но сохраняет окончания строк после ");" от изменения другими моделями. [1] sfk xex in.xml "_<row>[xwhite]<artist>*</[bytes]<album>*</ [байт]<дорожка>*</_[часть4]\t[часть8]\t[часть12]\n_" если in.xml содержит простые данные xml, например: <row><artist>foo</artist><album>bar</album> <track>foobar</track></row> затем переформатируйте это, чтобы разделить данные csv на табуляции. [2] sfk xex in.csv "_[lstart]*\t*\t*_<row>\n <исполнитель>[part2] </artist>\n <album>[part4]</album>\n <track>[part6]</track>\n </ряд>\n_" если in.csv содержит данные, разделенные табуляцией, например: имя исполнителя{TAB}название альбома{TAB}название трека затем переформатируйте это в данные xml. [3] реж | sfk xex -i -bylist dirtytags.txt переформатировать вывод команды Windows 'dir', например: 05.12.2013 19:17 <КАТАЛОГ> myproj 28.01.2010 22:08 197 readme.txt используя файл bylist dirtytags.txt, например: /??.??.????[белый]??:??[белый]<каталог>[белый]* /КАТАЛОГ : [часть13]\n/. /??.??.????[белый]??:??[белый][цифра][* не ( )][белый]* /файл: [часть14]\n/. производство продукции: DIR: мой проект файл: readme.txt sfk xex in.hpp "/bool[xwhite]bCl*;/" "/int[xwhite]iCl*;/" извлечь объявления переменных, такие как "bool bClDone;" или "инт iClCounter;" из исходного кода, включая утверждения в нескольких строках. sfk xex in.html "_<head>**</head>_" извлечь заголовок из html. обратите внимание, что "_" используется в качестве разделителя, так как "/" является частью текста. sfk xex in.txt "/[lstart][4 символа][15 символов][15 символов]*/ [часть2]\t[часть3]\t[часть4]\n/" +xed "/[white][char of (\t\r\n)]/[part2]/" +tabtocsv извлечь из данных фиксированного столбца, как показано ниже: [4] 7936ДЖЕЙМС ФУ АТЛАНТА 20140129 первые три столбца в виде данных, разделенных запятыми, например 7936, ДЖЕЙМС ФУ, АТЛАНТА sfk xex in.zip\\sub1.tar.bz2\\sub2.tar.gz\\Trace.hpp "/class*/" XE: извлекать фразы, начинающиеся с «класса», из .tar.gz внутри .tar.bz2 внутри файла .zip. XD: demo читает первые 1000 байт из sub2.tar.gz sfk xex in.txt "/rel: [02 цифры].[02 цифры].[04 цифры] /[setvar date][parts 2,3,4,5,6][endvar]/" +getvar ищет фразу типа "rel: 03.09.2016" в файле in.txt и сохраняет его как переменную sfk «дата». +getvar печатает все определенные переменные с их содержимым. [7] sfk xex in.xml "_<zone>**<id>*</id>_[часть" введите эту неполную команду, чтобы получить информацию о номере детали. затем выполните команду, например: sfk xex in.xml "_<zone>**<id>*</id>_[part4]\n_" +filt -line=3 +setvar zoneid +echo -var ".100/start.php?zone=#(zoneid)" из файла xml, например <zone><id>3</id></zone><zone><id>1</id></zone> <zone><id>8</id></zone><zone><id>2</id></zone> получите третий идентификатор и создайте URL-адрес http, используя эхо. добавьте +tweb для выполнения веб-запроса. [9] sfk xex foo.h +setvar a +затем фиксированный bar.c "/[lstart]#include \qfoo.h\q*[eol]/[getvar a]/" заменить текстовую строку: #include "foo.h" внутри файла bar.c по содержимому файла foo.h sfk -var setvar a="foo bar" +echo -pure "#(a)" +xex -justrc "_foo_" +if "rc=1" сказать "есть foo" проверьте, содержит ли переменная a 'foo' с помощью xex. может быть расширен для проверки нескольких гибких модели выражения параллельно. sfk -var setvar a="foo bar" +if "#(содержит(a,'foo')) = 1" сказать "есть foo" проверьте, содержит ли переменная a непосредственно 'foo'. быстрый, но только один статический текстовый шаблон. для подробностей введите: sfk help var sfk xex in.xml "/[пропустить]<[символы не>]>/" /работа/ искать «работу» в текстовых данных in.xml, но не в именах тегов, таких как <workbook> sfk echo aabbccdd +xed "/[2 символа][2 символа] [2 символа][2 символа]/[части 4,3,2,1]/" производит ddccbbaa, т.е. меняет местами 4 блока по 2 символа каждый. (преобразование с прямым порядком байтов) |