Lämppi
Чорт
Timoschenko
сорян, не удержался
Lämppi
Близко, но нет :р
Luсky
Vladislav
Привет! А никто не занимался детектом кодировки текстового файла на Lua? Что-нибудь типа chardet из python'a?
Snusmumriken
Ну как сказать. Если есть BOM — считаем за utf8.
Если нет — считаем за ascii или utf8 ))
Ivan
сp1251 отлично определится по такому алгоритму
Snusmumriken
Но так-то можно перекатать питоновую фигню. Понадобится какое-то время, но можно.
Cosmic Ranger
как в строку эту переменную поставить?
os.execute(‘bash {var}’)
так не получается
Cosmic Ranger
‘$s’, var вроде тоже не получается
Cosmic Ranger
а если после var ещё нужно писать
Cosmic Ranger
спасибо
Snusmumriken
Вариант для крутых:
function format(str, args)
str = str:gsub("$(%w+)", args)
return str
end
template = "bash $var1 $var2 - $var3"
args = {
var1 = "hello",
var2 = "world",
var3 = "myvar"
}
command = format(template, args)
print( command )
> bash hello world - myvar
Snusmumriken
Но это совсем понты, да.
Сначала с конкатенацией бы разобраться.
Snusmumriken
Какую интерполяцию?
Я довольно часто использую это когда надо что-то нашаблонить. А то и составить шаблоны из шаблонов: то же самое но типа-рекурсивно.
Snusmumriken
Ну я бы назвал это пыховыми загонами. Строки в пыхе/баше/жаваскрипте/перле и прочей текстоориентированной фигне — загребают переменные из окружения, поэтому как бы можно обозвать переносом данных из окружения в строку (собсно, подстановка переменных).
А в том же питоне есть format. В луях есть format. В СИШКЕ ЕСТЬ SPRINTF КОТОРЫЙ ДЕЛАЕТ ТО ЖЕ САМОЕ ))
И это типа стандартная операция форматирования. Эта штука — просто добавляет токены, мне лень каждый раз следить за порядком и не пришёл ли куда nil.
Луа самостоятельно переменные никуда не подставляет, я к этому. Сложно обозвать "интерполяцией".
Snusmumriken
А то знаешь, как называть именованные аргументы интерполяцией ))
Snusmumriken
Ох, хорошо, роза пахнет розой
Alexey
https://github.com/hishamhm/f-strings
Snusmumriken
Ужс какой
Snusmumriken
Глянул в сорц.
Просто жесть, я бы сказал ))0
Snusmumriken
Как пруф-оф-концепт норм, но не надо такое на проде мутить.
fgntfg
а как {} писать?
Lämppi
1: {
2: }
usernameak
Snusmumriken
Да ))
Snusmumriken
Всё равно советую выставить какие-то отличительные знаки
Заха́р
Привет, мир!
Помогите накатать функцию, которая бы переименовывала все файлы в каталоге, в соответствии со следующими критериями:
— преобразовать все имена файлов в нижний регистр;
— заменить пробелы на нижнее подчёркивание;
— взять из прежнего имени диапазон символов (например, только символы с 3-го по 13-й);
— исключить определённые слова из имени (например если встречаются слова «orange», «green», «cyan»);
— добавить к имени слово;
— определить настоящее расширение (если файл подписан как *.bmp, когда на самом деле он является *.tiff);
— добавить в конец имени дату (в формате: год_месяц_день час-минута-секунда);
— добавить в конец имени счётчик.
Наверняка на этот случай должны быть какие-то готовые решения?
Vlad
Заха́р
Заха́р
это не типичные задачи?
Vlad
Luсky
фигассе на hh тестовые задания!
Заха́р
Vlad
Без напряга это я имею ввиду спокойно попивая чаёк.
usernameak
на баше определить настоящее расширение делается в одну строчку
Luсky
можно же на баше написать и луём дёрнуть
Snusmumriken
Заха́р
Snusmumriken
Под линупсом os.rename прокнет. Но вот содержимое директории придётся получать сторонними путями.
Snusmumriken
Ещё: это luajit?
Заха́р
Ещё: это luajit?
вот не слишком я это понимаю.
Общая картина — файловый менеджер Double Commander, который использует библиотеку liblua5.1.so
usernameak
Заха́р
Snusmumriken
— преобразовать все имена файлов в нижний регистр;
lower работает только для латиницы.
local dir, file, fmt = path:match("(.*/)(.*)(%..*)"):lower()
— заменить пробелы на нижнее подчёркивание;
file = file:gsub("%s+", "_")
— взять из прежнего имени диапазон символов (например, только символы с 3-го по 13-й);
Если есть не-ascii — придётся подгрести либу utf8.
file = file:sub(3, 13)
— исключить определённые слова из имени (например если встречаются слова «orange», «green», «cyan»);
list = {orange = "", green = "", cyan = ""}
file = file:gsub("%w+", list)
— добавить к имени слово;
file = file .. "_myword"
— определить настоящее расширение (если файл подписан как *.bmp, когда на самом деле он является *.tiff);
Никак. Точнее через задницу, анализировать содержимое файла по сигнатурам.
— добавить в конец имени дату (в формате: год_месяц_день час-минута-секунда);
file = file .. "_" .. os.date("%y_%m_%d %H-%M-%S", os.time())
— добавить в конец имени счётчик.
file = file .. i
os.rename(path, dir .. file .. fmt)
Заха́р
— преобразовать все имена файлов в нижний регистр;
lower работает только для латиницы.
local dir, file, fmt = path:match("(.*/)(.*)(%..*)"):lower()
— заменить пробелы на нижнее подчёркивание;
file = file:gsub("%s+", "_")
— взять из прежнего имени диапазон символов (например, только символы с 3-го по 13-й);
Если есть не-ascii — придётся подгрести либу utf8.
file = file:sub(3, 13)
— исключить определённые слова из имени (например если встречаются слова «orange», «green», «cyan»);
list = {orange = "", green = "", cyan = ""}
file = file:gsub("%w+", list)
— добавить к имени слово;
file = file .. "_myword"
— определить настоящее расширение (если файл подписан как *.bmp, когда на самом деле он является *.tiff);
Никак. Точнее через задницу, анализировать содержимое файла по сигнатурам.
— добавить в конец имени дату (в формате: год_месяц_день час-минута-секунда);
file = file .. "_" .. os.date("%y_%m_%d %H-%M-%S", os.time())
— добавить в конец имени счётчик.
file = file .. i
os.rename(path, dir .. file .. fmt)
ооо! Класс! Спасибо! Буду разбираться!
Snusmumriken
— преобразовать все имена файлов в нижний регистр;
lower работает только для латиницы.
local dir, file, fmt = path:match("(.*/)(.*)(%..*)"):lower()
— заменить пробелы на нижнее подчёркивание;
file = file:gsub("%s+", "_")
— взять из прежнего имени диапазон символов (например, только символы с 3-го по 13-й);
Если есть не-ascii — придётся подгрести либу utf8.
file = file:sub(3, 13)
— исключить определённые слова из имени (например если встречаются слова «orange», «green», «cyan»);
list = {orange = "", green = "", cyan = ""}
file = file:gsub("%w+", list)
— добавить к имени слово;
file = file .. "_myword"
— определить настоящее расширение (если файл подписан как *.bmp, когда на самом деле он является *.tiff);
Никак. Точнее через задницу, анализировать содержимое файла по сигнатурам.
— добавить в конец имени дату (в формате: год_месяц_день час-минута-секунда);
file = file .. "_" .. os.date("%y_%m_%d %H-%M-%S", os.time())
— добавить в конец имени счётчик.
file = file .. i
os.rename(path, dir .. file .. fmt)
Первая регулярка делает вот так. То есть с двойными форматами используется только верхний. Если путь не полный (там только имя файла) или отсутствует формат — оно сломается, так что используй только на полных путях.
fgntfg
— преобразовать все имена файлов в нижний регистр;
lower работает только для латиницы.
local dir, file, fmt = path:match("(.*/)(.*)(%..*)"):lower()
— заменить пробелы на нижнее подчёркивание;
file = file:gsub("%s+", "_")
— взять из прежнего имени диапазон символов (например, только символы с 3-го по 13-й);
Если есть не-ascii — придётся подгрести либу utf8.
file = file:sub(3, 13)
— исключить определённые слова из имени (например если встречаются слова «orange», «green», «cyan»);
list = {orange = "", green = "", cyan = ""}
file = file:gsub("%w+", list)
— добавить к имени слово;
file = file .. "_myword"
— определить настоящее расширение (если файл подписан как *.bmp, когда на самом деле он является *.tiff);
Никак. Точнее через задницу, анализировать содержимое файла по сигнатурам.
— добавить в конец имени дату (в формате: год_месяц_день час-минута-секунда);
file = file .. "_" .. os.date("%y_%m_%d %H-%M-%S", os.time())
— добавить в конец имени счётчик.
file = file .. i
os.rename(path, dir .. file .. fmt)
надо в один gsub все сделать
Snusmumriken
Можно но лень.
Snusmumriken
Эффективнее цепочкой. Если что-то сломается — будет понятно где именно.
Snusmumriken
Мне как раз нравится луёвый подход, что мы спокойно цепочим что хотим.
fgntfg
задания на regexp предполагают нечитаемый regexp
Snusmumriken
Шо, слишком читаемо? Ща усложню ))
fgntfg
Snusmumriken
"Wait, forgot to escape a space. Wheeeee[taptaptap]eeeee"
Snusmumriken
это не типичные задачи?
Это типичные задачи, но слишком общие. Писать под них библиотеку нерационально, проще ручками наговнякать однострочники, как это я и сделал. Регулярки — не просто так существуют.
Snusmumriken
Библиотека для этого — всё равно что npm-пакет для отбивки пробелами строк, чтобы они были фиксированной длины. Ах да. https://habr.com/ru/post/280099/
Ivan
Snusmumriken
Это текст из оригинального стрипа xkcd, если мышку навести на картинку на оф сайте. Типа, скрытые от взгляда дополнительные смехуёчки.
Snusmumriken
Lämppi
Snusmumriken
Тут не так много звёзд, зато целых 11 форков.
Lämppi
Dika
Snusmumriken
Ну в общем, для общих задач в луях есть общие решения ))
А для конкретных — берём общие и делаем конкретные.
Надо кстати переписать питоновую либу path, она хороша и нормально работает с кучей осей. Пути, на самом деле, та ещё морока, особенно если делать кроссплатформу.
Я конечно написал сейчас регулярочку, но она весьма узкоспециализированная.
Заха́р
— преобразовать все имена файлов в нижний регистр;
lower работает только для латиницы.
local dir, file, fmt = path:match("(.*/)(.*)(%..*)"):lower()
— заменить пробелы на нижнее подчёркивание;
file = file:gsub("%s+", "_")
— взять из прежнего имени диапазон символов (например, только символы с 3-го по 13-й);
Если есть не-ascii — придётся подгрести либу utf8.
file = file:sub(3, 13)
— исключить определённые слова из имени (например если встречаются слова «orange», «green», «cyan»);
list = {orange = "", green = "", cyan = ""}
file = file:gsub("%w+", list)
— добавить к имени слово;
file = file .. "_myword"
— определить настоящее расширение (если файл подписан как *.bmp, когда на самом деле он является *.tiff);
Никак. Точнее через задницу, анализировать содержимое файла по сигнатурам.
— добавить в конец имени дату (в формате: год_месяц_день час-минута-секунда);
file = file .. "_" .. os.date("%y_%m_%d %H-%M-%S", os.time())
— добавить в конец имени счётчик.
file = file .. i
os.rename(path, dir .. file .. fmt)
Что-то я видимо не так записываю, ничего не работает.
Файловый менеджер передаёт скрипту в параметрах пути к файлам — params[1].
Если я делаю так:
local params = {...};
local dt = os.date('%y%m%d')
local p = SysUtils.ExtractFilePath(params[1])
local e = SysUtils.ExtractFileExt(params[1])
local n = SysUtils.ExtractFileName(params[1])
n = string.sub(n, 1, string.len(n) - string.len(e))
os.rename(params[1], n .. dt .. e);
то как и задумано добавляется дата.
Заха́р
но если пытаюсь использовать твой пример для удаления пробелов:
local params = {...};
local n = SysUtils.ExtractFileName(params[1])
n = string.sub(n, 1, string.len(n) - string.len(e))
local file = n:gsub("%s+", "_")
os.rename(params[1], file .. e);
то ничего не происходит.
Заха́р
Где я делаю неправильно?
Snusmumriken
Вдобавок, os.rename возвращает два аргумента: success и error_text. Их тоже можно вывести ))
Заха́р
Snusmumriken
Нет.
Snusmumriken
"вывести содержимое " — имеется ввиду не "описание того что делает код", это и так все знают, а что там конкретно в строке. Что будет если это вывести print'ом или аналогом.
Snusmumriken
В этой твоей фиговине есть print? Если нет — см
"Если нет print'а для отладки — записывай в лог-файл, или если есть — посмотри аналог MsgBox"
Заха́р
эм... могу например через консоль прогнать..
Там же должен быть канпилятор какой-нить консольный для луа? Могу поставить что надо.
Заха́р
Что посоветуешь?