Команды SFK


    1        2        3        4        5        6        7        8        9        10    

Раздел 4. Text Processing - Обработка текста
addhead | addtail | count | difflines | filter | head | joinlines | linelen | load | ofilter | perline | printloop | replace | run | runloop | snapto | sort | strings | tail | xed | xex | xreplace |


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

Команда: xex

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

sfk ... +xex /from/ [/from2/] текстовый фильтр потока с использованием простых выражений SFK

  • — принимает ввод текстового потока из предыдущей команды или одного файла.

  • - объединяет все строки в один большой блок, который можно искать целиком.

  • - снова разбивает вывод на строки для дальнейшего использования или передает вывод в двоичном виде в +xed

    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 или более шестнадцатеричных цифр

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

    [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. Последующие пакетные команды могут выполняться медленнее.

    ПАРАМЕТРЫ

  • -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 - использовать только первый совпадающий результат

    Поддержка цепочки ввода-вывода

    extract ... +xed поддерживает передачу двоичных данных.

    xed ... +xed поддерживает передачу двоичных данных.
    Во всех остальных случаях, например, xed... +filter данные передаются в виде текстовых строк без нулевых байтов и до 4000 символов в строке.
    Для двоичной передачи требуется свободная память, в четыре раза превышающая фактическое количество переданных байтов.

    Неожиданные шестнадцатеричные данные с фиксированной цепочкой Если вы используете xed и получаете неожиданный шестнадцатеричный вывод, например, 746573746... это означает, что следующая команда не может обрабатывать потоковые данные. Тогда используйте опцию -tolines.

    Неожиданные разрывы строк с помощью +tofile

    Если длина строки превышает 4096 символов, вместо этого используйте -tofile. Это происходит, если данные содержат символы возврата каретки. Добавьте «/\r//», чтобы удалить их.

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

    sfk swap Изменение порядка символов в одной строке

    Поддержка WEB-доступа

    Извлечение заголовков head из веб-страницы может быть выполнено следующим образом:

    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 «percent %» % — это процент \x25"

    Неожиданное поведение повторной замены

    В зависимости от входных данных и выражений поиска/замены может случиться так, что выполнение одной и той же замены несколько раз в одном и том же потоке приведет к появлению новых совпадений, которых не было при первом запуске.
    Для получения подробной информации прочитайте расширенный текст справки sfk replace с помощью «sfk replace -full».

    Многострочные параметры в кавычках

    Поддерживаются в скриптах, используя полную обрезку. Введите «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 из текста и переформатируйте их как один оператор в строке.
    Обратите внимание, что «/);[eol]/[all]/» — это шаблон обложки, что означает он ничего не меняет, но сохраняет окончания строк после ");"

  • 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>
    Затем переформатируйте его в CSV-данные, разделенные вкладками. [2]

  • 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 содержит данные, разделенные табуляцией, например: artistname{TAB}albumname{TAB}trackname
    Затем переформатируйте его в XML-данные. [3]

      dir | sfk xex -i -bylist dirtags.txt

      Вывод команды 'dir' форматирования окон выглядит следующим образом: 05.12.2013 19:17 <DIR> myproj 28.01.2010 22:08 197 Readme.txt
      Используя файл bylist dirtags.txt,
      например: /??.??.???? [white]??:?? [white]<реж>[white]*
      /DIR : [part13]\n/.
      /??.??.???? [white]??:?? [white] [digit] [* не ( )] [white]*
      /файл: [part14]\n/.

      Результат:
      DIR : myproj
      Файл: 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]
    7936ДЖЕЙМС ФУ АТЛАНТА 20140129
    первые три столбца в виде данных, разделенных запятыми, таких как
    7936,ДЖЕЙМС ФУ,АТЛАНТА

  • 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.
    Добавьте +tweb для выполнения веб-запроса. [9]

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