addhead | addtail | count | difflines | filter | head | joinlines | linelen | load | ofilter | perline | printloop | replace | run | runloop | snapto | sort | strings | tail | xed | xex | xreplace | Команда: xex Фильтрация текстового потока с помощью подстановочных знаков и простых выражений
xed/xex предназначен для последующей обработки потоков или файлов данных небольшого и среднего размера. Не подходит для редактирования больших файлов размером более 100 МБ, так как весь контент должен помещаться в память несколько раз. Используйте «sfk xreplace» для обработки больших файлов. Подстановочные знаки и выражения 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 или более шестнадцатеричных цифр
Специальные ключевые слова, которые не считаются токенами:
Как найти или заменить специальные символы: Приоритеты расширения: (сначала самый высокий)Если две части поиска расположены рядом и один и тот же входной символ соответствует обеим, то применяются следующие приоритеты: Это означает, что в "/[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 считаются отдельной частью,
их НЕ обязательно указывать в тексте. Поддерживаемые шаблоны косой черты: \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 символов. Замечания по производительности Вместо этого используйте /[lstart]*foobar/. ПАРАМЕТРЫ case - сравнивать с учетом регистра, по умолчанию nocase. Дополнительные сведения см. в справке SFK NoCase bylist x - чтение шаблонов /from/to/ из файла x,
поддержка нескольких строк в одном шаблоне
bylinelist x - чтение шаблонов /from/to/ или просто /from/
из файла с одним шаблоном в строке. Лучше всего подходит для поиска многих фраз с помощью простого переформатирования вывода или его отсутствия i - обрабатывать текстовый поток из стандартного ввода
tolines - принудительный вывод в виде текстовых строк.Используйте это, если вы получили неожиданные шестнадцатеричные данные nomark - не подсвечивать изменения в выводе
nocol - всё без подсветки, чтобы освободить больше памяти
write - если указано имя входного файла, перезаписать файл с измененными данными. Создает пустой, если шаблоны поиска не найдены tofile f - записать вывод в файл f.Не используйте цепочку +tofile, поскольку она разбивает данные на текстовые строки. rawterm - при выводе на терминал не удалять коды ниже 32. Нулевые байты всегда удаляются dump[raw ] - создать шестнадцатеричный дамп [raw = без подсветки EOL]
crlf,-lf - для заголовков файлов и по умолчанию totext: forceОкончания строк CRLF или LF вместо значений по умолчанию justrc - без вывода, просто установить код возврата
firsthit - использовать только первый совпадающий результат
Поддержка цепочки ввода-вывода
Неожиданные разрывы строк с помощью +tofile Если длина строки превышает 4096 символов, вместо этого используйте -tofile. Это происходит, если данные содержат символы возврата каретки. Добавьте «/\r//», чтобы удалить их. СМОТРИТЕ ТАКЖЕ
Поддержка WEB-доступа Извлечение заголовков head из веб-страницы может быть выполнено следующим образом:
Чтение архивного файла xed может напрямую читать записи архивных файлов, такие как src.zip\\sub1.bz2\\sub2.tar.gz. Для получения подробной информации и ограничений введите «sfk help xe». Остерегайтесь командных символов оболочки Чтобы найти или заменить текстовые шаблоны, содержащие пробелы или специальные символы,
такие как <>|!&?*, вы должны добавить кавычки "" вокруг параметров,
иначе среда оболочки уничтожит вашу команду. Неожиданное поведение повторной замены В зависимости от входных данных и выражений поиска/замены может случиться так,
что выполнение одной и той же замены несколько раз в одном и том же потоке приведет
к появлению новых совпадений, которых не было при первом запуске. Многострочные параметры в кавычках Поддерживаются в скриптах, используя полную обрезку. Введите «sfk script» для получения подробной информации. Коды возврата для пакетных файлов 0 = нет совпадений, 1 = совпадения найдены, >1 = произошла серьезная ошибка. См. также «sfk help opt», чтобы узнать, как повлиять на обработку ошибок. О примерах чисел [со скобками] Если вы видите [1], введите «sfk cmd 1» для всей команды в одной строке. ПРИМЕРЫ Примечание: дополнительные примеры см. также в разделе "sfk xed". sfk xex in.txt "_foo*bar_[part2]\n_"
Извлеките любой текст, найденный в одной строке между foo и bar, используя в качестве
символа-разделителя «_» вместо «/». sfk xex in.txt "_\qfoo\q[.100 bytes]\qbar\q_[all]\n_"
Извлеките любой текст, начинающийся с «foo», заключенный в двойной кавычки, имеющие длину до 100 байт (включая CR или LF, т.е. в несколько текстовых строк), затем заканчивается строкой, заключенной в двойные кавычки, и распечатывает все части. sfk xex in.cpp "/printf([bytes]);/[all]\n/" +xed "/);[eol]/[all]/" "/[eol][.100 байт \x20]/ /"
Соберите все (многострочные) операторы printf из текста и переформатируйте их как один оператор в строке.
sfk xex in.xml "_<row>[xwhite]<artist>*</[bytes]<album>*</
[bytes]<track>*</_[part4]\t[part8]\t[part12]\n_"
Если IN.XML содержит простые XML-данные, такие как:
<row><artist>foo</artist><album>bar</album><track>foobar</track></row>
sfk xex in.csv "_[lstart]*\t*\t*_<row>\n <artist>[part2]
</artist>\n <album>[part4]</album>\n <track>[part6]</track>\n
</row>\n_"
Если IN.csv содержит данные, разделенные табуляцией, например:
Вывод команды 'dir' форматирования окон выглядит следующим образом:
05.12.2013 19:17 <DIR> myproj
28.01.2010 22:08 197 Readme.txt
Результат: sfk xex in.hpp "/bool[xwhite]bCl*;/" "/int[xwhite]iCl*;/"
Извлечь объявления переменных, такие как "bool bClDone;" или "int iClCounter;" из исходного кода, в том числе в нескольких строках sfk xex in.html "_<head>**</head>_"
Извлечь раздел head из HTML-кода. Обратите внимание, что "_" имеет значение и используется в качестве разделителя, так как "/" является частью текста sfk xex in.txt "/[lstart][4 chars][15 chars][15 chars]*/
[part2]\t[part3]\t[part4]\n/"+xed "/[white][char of (\t\r\n)]/[part2]/" +tabtocsv
Извлечь из фиксированных данных столбца, как показано ниже: [4] sfk xex in.zip\\sub1.tar.bz2\\sub2.tar.gz\\Trace.hpp "/class*/"
XE: извлечение фраз, начинающихся с "class" из .tar.gz в файле .tar.bz2 в файле .zip. XD: демонстрация считывает первые 1000 байт из sub2.tar.gz sfk xex in.txt "/rel: [02 digits].[02 digits].[04 digits]
/[setvar date][parts 2,3,4,5,6][endvar]/" +getvar
Поиск фразы вида "rel: 03.09.2016" в .txt и сохраняет его как переменную sfk "date". Функция +getvar Выводит все определенные переменные с их содержимым. [7] sfk xex in.xml "_<zone>**<id>*</id>_[part"
Введите эту неполную команду, чтобы получить сведения о номере детали. 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>
получаем 3-й идентификатор и создаем http URL с помощью echo. sfk xex foo.h +setvar a +then xed 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" tell "got foo"
Проверяем, содержит ли переменная A 'foo' с помощью XEX. sfk -var setvar a="foo bar"
+if "#(contains(a,'foo')) = 1" tell "got foo"
Проверьте, содержит ли переменная A 'foo' напрямую. Быстрый, но только один статический текстовый шаблон. Для получения подробной информации введите: SFK Help var sfk xex in.xml "/[skip]<[chars not >]>/" /work/
Поиск 'work' в текстовых данных in.xml, но не в именах тегов, таких как <рабочая книга> sfk echo aabbccdd +xed "/[2 chars][2 chars]
[2 chars][2 chars]/[parts 4,3,2,1]/"
производит ddccbbaa, т.е. меняет местами 4 блока gо 2 символа (преобразование с обратным порядком байтов) |