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