
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 символа каждый. (преобразование с прямым порядком байтов) |
![]() |