Команды 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  

Команда: xed

Редактирование текста потока или текстового файла

с использованием подстановочных знаков и простых выражений

sfk ... +xed /from/to/ [/from2/to2/] текстовый редактор потока, использующий простые выражения SFK

  • принимает ввод текстового потока из предыдущей команды или двоичный поток из извлечения sfk

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

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

  • также может читать и записывать один файл

    xed/xex предназначен для последующей обработки потоков или файлов данных небольшого и среднего размера. Не подходит для редактирования больших файлов размером более 100 МБ, так как весь контент должен помещаться в память несколько раз. Используйте «sfk xreplace» для обработки больших файлов.

    Подстановочные знаки и выражения SFK

    Выражения SFK — это простые шаблоны, содержащие буквенный текст, подстановочные знаки * и ? и классы символов в квадратных скобках []. По сути, синтаксис предоставляет расширенные подстановочные знаки, но не содержит дополнительной логики и не связан с регулярными выражениями. Шаблоны поиска окружены символом-разделителем, которым может быть что угодно, не содержащееся в тексте поиска, например / или _

    Внутри шаблона /fromtext/totext/ fromtext может содержать:

    • * От 0 до 4000 символов в одной текстовой строке или абзаце, т.е. все байты, кроме CR, LF или NULL. 4000 — это просто максимум по умолчанию, который можно изменить следующим образом:

    • [0.100000 chars] - от 0 до 100 000 символов в одной текстовой строке или абзаце, т.е. то же, что *, но с большим диапазоном.

    • ? - один символ

    • ????? - то же, что и [5.5 chars] или [5 chars]

    • [bytes] - От 0 до 4000 байт (с CR,LF,NULL), т.е. он собирает поток текста по строкам, даже в двоичных данных

    • ** то же самое, что и [bytes]

    • [0.100 bytes] - От 0 до 100 байт

    • [.100000 bytes] - до 100000 байт

    • [1.* bytes] - 1 для максимального количества байт по умолчанию

    • [2 chars] - ровно 2 символа

    • [30 bytes] - ровно 30 байт

    • [byte of aeiou] - одна гласная (A OR A ИЛИ 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] - то же, что и [bytes not \r\n\0] , т.е. собрать текст в строку

    • [char not ( \t)] - то же, что [byte not (\r\n\0\t)], все, кроме пробелов и табуляции

    • [char not )( \t] - не скобки, пробелы и табуляции, как и not (\(\) \t)

    • [chars of a-z0-9] - означает a-zA-Z0-9 в качестве поиска, регистр по умолчанию не учитывается

    • [chars of \x61-\x7A] - ищет a-z, но не A-Z, или использовать параметр -case для поиска без учета регистра

    • [eol] - конец строки по символам: CRLF или LF или CR

    • [white] = символов (\t ) - 0 или более пробелов

    • [xwhite] = байт (\t \r\n) - то же самое, но через строку

    • [1 white] = байт (\t ) - 1 пробел

    • [digit] = байт (0-9) - 1 цифра

    • [digits] = байт (0-9) - 0 или более цифр

    • [hexdigit] = байт (0-9a-f) - 1 шестнадцатеричная цифра

    • [hexdigits] = байт (0-9a-f) - 0 или более шестнадцатеричных цифр

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

    [skip] - в начале шаблона: такой текст пропускать полностью, не считать его поисковым совпадением

    [keep] - выполнит поиск также по следующему тексту, но сохранит его во входных данных, не используя его.

    [ortext] - foo[ortext]bar ищет слово foo или bar, [ortext] допустим только между литералами.

    Якоря, которые не имеют собственной длины:

    [start] - начало файла

    [end] - конец файла

    [lstart] - начало строки, т.е.начало или CRLF или CR или LF

    [lend] - логический конец строки, т.е. eol или конец файла.
    Чтобы заменить концы строки, используйте [EOL]

    Как искать или заменять специальные символы:

  • для поиска или замены текста, содержащего литеральные символы * ? \ [ ] их необходимо экранировать, например: \* \? \\ \[ \]

  • ( ) экранируются только в списках символов, например \( \)

  • для поиска или замены прямого слэша '/' ввести \x2f или использовать другой символ вокруг текста from/to, например, _fromtext_totext_

  • параметры с пробелами и нетривиальными символами должны быть заключены в двойные кавычки "", см. также раздел "О символах команд оболочки" ниже.

    Приоритеты расширения: (сначала высший)

    Если две части поиска находятся рядом, и один и тот же ввод соответствует обоим, то применяются следующие приоритеты:

  • 5: start, end, lstart, lend
  • 4: литеральный текст, eol
  • 3: классы белого списка: байт, байты of
  • 2: классы черного списка: символы not, байты not
  • 1: простые подстановочные знаки: ?, *, **, байт, байты, символы

    Это означает, что в "/[bytes]foo/" [bytes] перестанут собирать. При том же или более высоком приоритете правая сторона останавливает левую сторону.

    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] relname без последнего расштрения

  • [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":

  • \( = для использования литерального символа "("

  • \) = для использования литерального символа ")"

    Параметры выражения

  • -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, Поддержка нескольких строк в одном шаблоне.
    Для получения подробной информации введите: SFK Rep -Full

  • -bylinelist x - чтение шаблонов /from/to/ или просто /from/ из файла с одним шаблоном в строке.
    Лучше всего подходит для поиска многих фраз с помощью простого переформатирования вывода или без него

  • -i - обрабатывать текстовый поток из стандартного ввода

  • -tolines - принудительный вывод в виде текстовых строк. Используйте это если вы получили неожиданные шестнадцатеричные данные

  • -nomark - не подсвечивать изменения в выводе

  • -nocol - вообще нет цвета, чтобы освободить больше памяти

  • -write - если указано имя входного файла, перезаписать файл с измененными данными

  • -tofile f - записать вывод в файл f. Не использовать +tofile в цепочке, так как она разбивает данные на текстовые строки

  • -rawterm - при выводе на терминал не удалять коды ниже 32. Нулевые байты всегда удаляются

  • -dump[raw]] - создать шестнадцатеричный дамп [raw = без подсветки EOL]

  • -crlf,-lf - для заголовков файлов и по умолчанию totext: принудительно окончания строк CRLF или LF вместо значений по умолчанию

  • -justrc - без вывода, просто установить код возврата

  • -firsthit - использовать только первый совпадающий результат

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

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

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

    Неожиданные шестнадцатеричные данные с фиксированной цепочкой

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

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

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

    См. также

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

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

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

       sfk xex http://192.168.1.100/ "_**_"
       sfk xex http://.100/ "_**_"
       sfk web .100 +xex "_**_"
    

    Чтение файлов архива

    XED может напрямую считывать записи архивных файлов, такие как src.zip\\sub1.bz2\\sub2.tar.gz.
    Для получения подробной информации и ограничений введите «sfk help xe»

    Остерегайтесь командных символов Shell.

    Чтобы найти или заменить текстовые шаблоны, содержащие пробелы или специальные символы, такие как < >|!&?*, вы должны добавить кавычки "" вокруг параметров, иначе среда оболочки уничтожит вашу команду.
    Например, шаблон /foo bar/other/ должен быть записан как «/foo bar/other/» в файле .bat или .cmd, процент % должен быть экранирован, как %%, даже в кавычках: sfk echo -spat «процент %% — это процент \x25"

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

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

    Многострочные параметры в кавычках поддерживаются в скриптах.

    Использование полной обрезки. введите «sfk script» для получения подробной информации.

    Коды возврата для пакетных файлов

    0 = совпадений нет, 1 = совпадения найдены, > 1 = произошла серьезная ошибка. См. также «sfk help opt», чтобы узнать, как повлиять на обработку ошибок.

    О примерах чисел с [скобками]

    Если вы видите [1], введите «sfk cmd 1» для всей команды в одной строке.

    ПРИМЕРЫ
    Примечание: также смотрите "sfk xex" для дальнейших примеров.

  • sfk xed in.txt "/foo*bar/goo/" -tofile out.txt Прочитать файл in.txt, замените «foo» и «bar» длиной до 4000 символов между ними в одной строке на слово «goo». Записать вывод в файл out.txt

  • sfk xed in.txt "/foo*bar/goo/" -write то же, что и выше, но заменить в файле in.txt

  • sfk xed in.html "/<!--**-->//" -tofile out.html Удалить из HTML-кода все блоки примечаний, начинающиеся с "<!--" и заканчивающиеся "-->" в любом количестве строк длиной до 4000 байт.

  • sfk xex in.zip\\sub1.tar.bz2\\sub2.tar.gz\\Trace.hpp "/class*/" XE: извлечение фраз, начинающихся с "class" из .tar.gz в файле .tar.bz2 в файле .zip.

  • sfk xed in.txt /foo12/foo34/ /foo34/foo12/ -tofile out.txt Меняет местами foo12 и foo34. В XED замененный текст не заменяется другими шаблонами в той же команде.

  • sfk xed in.dat -dump "/\x66\x6f\x6f[0.100 bytes]\x62\x61\x72/---/" Заменить двоичные данные, начиная с байтов 0x66, 0x6f, 0x6f, заканчивающиеся на 0x62, 0x61, 0x72 и до 100 байт между ними «---» и отображать шестнадцатеричный дамп выходных данных [5]
    Добавить -tofile out.dat для записи выходных данных в файл.

  • sfk xed in.csv "/*\t*\t*Genway Rd*/[parts 1,2,5,6,7,2,3]/" CSV-файл, разделенный табуляцией, с именем, улицей, городом, например:
     Bemond Furn. Ltd    147 Elney Rd      Hertford NY 83058
     Candale Design Ltd  Seattle KS 51028  868 Genway Rd
     Betree Furn. Ltd    311 Napton Rd     Portland NC 97702
    
    содержит неверные записи с надписью «Genway Rd» в третьем столбце. Исправит только эти записи, поменяв местами столбцы 2 и 3.
    Часть 2 — это просто символ табуляции, который используется дважды при выводе.

  • sfk xed in.txt "/\r//" +xed "_[lstart]\* [bytes][keep]\n\* [ortext]\n\n_<li>[part3]</li>_" Изменит перечисление обычного текста, например [6]
    * первый пункт двухстрочный текст
    * второй
    * третий

    За ним следует пустая строка HTML-кода, например

  • первый элемент представляет собой текст в две строки.
  • секунда
  • третий
  • Что следует учитывать:

  • - Каждый абзац перечисления заканчивается на другой строке, начинающейся с *, или на пустой строке \n\n.
  • - Текстовые файлы Windows используют окончания строк \r\n, поэтому для удобного поиска пустых строк \n\n сначала используйте /\r//. Это необходимо сделать отдельным +фиксом, иначе редактируемые концы строк будут пропущены при дальнейших поисках.
  • — Мы не можем искать строку, заканчивающуюся [eol], поскольку [ortext] требует чистых литералов, таких как \n.
  • - [keep] указывает искать до \n*, но не использовать это, т.е. дальнейшие поиски могут повторно найти и заменить его как [lstart]*

  • sfk version -own +filter -stabform "$col5" +setvar ver +then xed info.xml "=<program_version>**</program_version> [part1][getvar ver][part3]="

    Получите номер версии из sfk, сохраните его в переменной sfk «var» и заполните его в info.xml, изменив текст в теге program_version. Поскольку в данных XML используются символы / и _ , мы используем другой символ-разделитель "=". [8]

  • sfk xed in.txt "/[eol]/, /" +xed "/[60 chars]*, /[all]\n/" Если in.txt содержит только одно короткое слово в строке, отформатируйет его как текст, разделенный запятыми, используя не менее 60 символов в строке.

  • sfk xed in.txt "/*[eol]/\q[part1]\q, /" +xed "/[60 chars]*, /[all]\n/" То же, что и выше, но окружают слова кавычками

  • 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 echo aabbccdd +xed "/[2 chars][2 chars] [2 chars][2 chars]/[parts 4,3,2,1]/" Получить ddccbbaa, т.е. меняет местами 4 блока по 2 символа. (Преобразование с обратным порядком байтов)