addhead | addtail | count | difflines | filter | head | joinlines | linelen | load | ofilter | perline | printloop | replace | run | runloop | snapto | sort | strings | tail | xed | xex | xreplace | Команда: xed Редактирование текста потока или текстового файлас использованием подстановочных знаков и простых выражений
xed/xex предназначен для последующей обработки потоков или файлов данных небольшого и среднего размера. Не подходит для редактирования больших файлов размером более 100 МБ, так как весь контент должен помещаться в память несколько раз. Используйте «sfk xreplace» для обработки больших файлов. Подстановочные знаки и выражения SFK Выражения SFK — это простые шаблоны, содержащие буквенный текст, подстановочные знаки * и ? и классы символов в квадратных скобках []. По сути, синтаксис предоставляет расширенные подстановочные знаки, но не содержит дополнительной логики и не связан с регулярными выражениями. Шаблоны поиска окружены символом-разделителем, которым может быть что угодно, не содержащееся в тексте поиска, например / или _ Внутри шаблона /fromtext/totext/ fromtext может содержать:
Специальные ключевые слова, которые не считаются токенами:
Якоря, которые не имеют собственной длины:
Как искать или заменять специальные символы: * ? \ [ ] их необходимо экранировать, например:
\* \? \\ \[ \]
( ) экранируются только в списках символов, например \( \)
'/' ввести \x2f
или использовать другой символ вокруг текста from/to, например, _fromtext_totext_
Приоритеты расширения: (сначала высший) Если две части поиска находятся рядом, и один и тот же ввод соответствует обоим, то применяются следующие приоритеты: Это означает, что в "/[bytes]foo/" [bytes] перестанут собирать. При том же или более высоком приоритете правая сторона останавливает левую сторону.
[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 - использовать только первый совпадающий результат
Поддержка цепочки ввода-вывода
Неожиданные шестнадцатеричные данные с фиксированной цепочкой Если вы используете 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. Остерегайтесь командных символов Shell. Чтобы найти или заменить текстовые шаблоны, содержащие пробелы или специальные символы,
такие как < >|!&?*, вы должны добавить кавычки "" вокруг параметров,
иначе среда оболочки уничтожит вашу команду. Неожиданное поведение повторной замены В зависимости от входных данных и выражений поиска/замены может случиться так, что выполнение одной и той же замены несколько раз в одном и том же потоке приведет к появлению новых совпадений, которых не было при первом запуске. Для получения подробной информации прочитайте расширенный текст справки sfk replace с помощью «sfk replace -full». Многострочные параметры в кавычках поддерживаются в скриптах. Использование полной обрезки. введите «sfk script» для получения подробной информации.Коды возврата для пакетных файлов 0 = совпадений нет, 1 = совпадения найдены, > 1 = произошла серьезная ошибка. См. также «sfk help opt», чтобы узнать, как повлиять на обработку ошибок.О примерах чисел с [скобками] Если вы видите [1], введите «sfk cmd 1» для всей команды в одной строке.ПРИМЕРЫ
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-кода, например
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 символа. (Преобразование с обратным порядком байтов) |