addhead | addtail | count | difflines | filter | head | joinlines | linelen | load | ofilter | perline | printloop | replace | run | runloop | snapto | sort | strings | tail | xed | xex | xreplace | Команда: xed sfk ... +xed /от/до/ [/от2/до2/] потоковый текстовый редактор с использованием SFK Simple Expressions. - принимает ввод текстового потока из предыдущей команды, или бинарный поток из извлечения 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-xed больше в Книге СФК Книга SFK содержит учебник на 60 страниц, в том числе подробные фиксированные примеры с вводом, скриптом и выводом. введите "книга sfk" для деталей. Примеры Примечание: см. также "sfk xex" для дальнейших примеров. sfk xed in.txt "/foo*bar/goo/" -tofile out.txt читать из файла in.txt, заменить "foo" и "bar" на до 4000 символов между ними, в одной строке, по слову "гу". записать вывод в файл out.txt. sfk исправлен в.txt "/foo*bar/goo/" - написать то же, что и выше, но заменить в файле in.txt sfk xed in.html "/<!--**-->//" -tofile out.html удалить все блоки примечаний, начинающиеся с "<!--" и оканчивающийся на "-->", через любое количество строк, до 4000 байт, из кода HTML. 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 xed in.txt /foo12/foo34/ /foo34/foo12/ -tofile out.txt меняет местами foo12 и foo34. с фиксированным, замененный текст не снова заменены другими шаблонами в той же команде. sfk исправлен в.dat -dump "/\x66\x6f\x6f[0,100 байт]\x62\x61\x72/---/" заменить бинарные данные, начинающиеся с байтов 0x66, 0x6f, 0x6f, заканчивающийся на 0x62, 0x61, 0x72 и до 100 байт между ними на "---" и показать шестнадцатеричный дамп выходных данных. [5] добавить -tofile out.dat для записи выходных данных в файл. sfk xed in.csv "/*\t*\t*Genway Rd*/[части 1,2,5,6,7,2,3]/" файл CSV, разделенный вкладками, с названием, дорогой, городом, например Бемонд Ферн. Ltd 147 Elney Rd Hertford NY 83058 Candale Design Ltd Сиэтл KS 51028 868 Genway Rd Бетри Ферн. Ltd 311 Napton Rd Портленд Северная Каролина 97702 содержит неправильные записи с «Genway Rd» в 3-м столбце. исправить только эти записи, поменяв местами столбцы 2 и 3. часть 2 - это просто символ табуляции, дважды используемый в выводе. sfk xed in.txt "/\r//" +xed "_[lstart]\* [bytes] [сохранить]\n\* [или текст]\n\n_<li>[part3]</li>_" изменить простое текстовое перечисление, например [6] * первый пункт есть текст в две строки * второй * в третьих за которой следует пустая строка HTML-кода, например <li>первый элемент двухстрочный текст</li> <li>секунда</li> <li>третий</li> вещи, чтобы рассмотреть: - каждый абзац enum заканчивается на другой строке начиная с * или с пустой строки \n\n - текстовые файлы Windows используют окончания строки \r\n, чтобы обеспечить удобный \n\n поиск пустые строки сначала используют /\r//. это должно быть делается как отдельный +xed, иначе отредактированный концы строк пропускаются при дальнейшем поиске. - мы не можем искать строки, оканчивающиеся на [eol] поскольку [ortext] требует чистых литералов, таких как \n. - [keep] указывает искать до \n*, но не потреблять это, т.е. дальнейшие поиски можно повторно найти и заменить его как [lstart]* версия sfk -own +filter -stabform "$col5" +setvar ver +затем исправил info.xml "=<program_version>**</program_version> =[часть1][версия getvar][часть3]=" получить номер версии из sfk, сохранить его в sfk переменную "var" и заполните ее в info.xml, изменив текст внутри тега program_version. потому что оба / и символы _ используются в данных xml, мы используем другой символ-разделитель "=". [8] sfk xed in.txt "/[eol]/, /" +xed "/[60 символов]*, /[all]\n/" если in.txt содержит только одно короткое слово в строке переформатируйте это как текст, разделенный запятыми, используя не менее 60 символов в строке. sfk исправлен в.txt "/*[eol]/\q[part1]\q, /" +xed "/[60 символов]*, /[все]\n/" то же, что и выше, но заключая слова в кавычки. sfk xex foo.h +setvar a +затем фиксированный bar.c "/[lstart]#include \qfoo.h\q*[eol]/[getvar a]/" заменить текстовую строку: #include "foo.h" внутри файла bar.c по содержимому файла foo.h sfk echo aabbccdd +xed "/[2 символа][2 символа] [2 символа][2 символа]/[части 4,3,2,1]/" производит ddccbbaa, т.е. меняет местами 4 блока по 2 символа каждый. (преобразование с прямым порядком байтов) |