Lämppi
Чорт
Timoschenko
Ну, 3% это довольно мало.
для этого диктатора это еще много
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: }
Snusmumriken
Да ))
Snusmumriken
Всё равно советую выставить какие-то отличительные знаки
Заха́р
Привет, мир! Помогите накатать функцию, которая бы переименовывала все файлы в каталоге, в соответствии со следующими критериями: — преобразовать все имена файлов в нижний регистр; — заменить пробелы на нижнее подчёркивание; — взять из прежнего имени диапазон символов (например, только символы с 3-го по 13-й); — исключить определённые слова из имени (например если встречаются слова «orange», «green», «cyan»); — добавить к имени слово; — определить настоящее расширение (если файл подписан как *.bmp, когда на самом деле он является *.tiff); — добавить в конец имени дату (в формате: год_месяц_день час-минута-секунда); — добавить в конец имени счётчик. Наверняка на этот случай должны быть какие-то готовые решения?
Заха́р
это не типичные задачи?
Luсky
фигассе на hh тестовые задания!
usernameak
это не типичные задачи?
нет, задачи обычные, просто никто их не делает
Заха́р
нет, задачи обычные, просто никто их не делает
а почему? На баше, типо, проще реализовать?
Vlad
Без напряга это я имею ввиду спокойно попивая чаёк.
usernameak
на баше определить настоящее расширение делается в одну строчку
Luсky
можно же на баше написать и луём дёрнуть
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
"Wait, forgot to escape a space. Wheeeee[taptaptap]eeeee"
обычно пробел не нужно эскепить
Snusmumriken
Это текст из оригинального стрипа xkcd, если мышку навести на картинку на оф сайте. Типа, скрытые от взгляда дополнительные смехуёчки.
Snusmumriken
Тут не так много звёзд, зато целых 11 форков.
Lämppi
А, там есть мой любимый
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
но если пытаюсь использовать твой пример для удаления пробелов: 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); то ничего не происходит.
А путь до директории ты куда дел? Используй абсолютные пути когда это возможно. Первое что ты должен сделать прежде чем задавать вопросы — вывести содержимое params[1] и file .. e. Посмотреть, что ты переименовываешь и во что. Я ведь не гадалка, и ты тоже. Если нет print'а для отладки — записывай в лог-файл, или если есть — посмотри аналог MsgBox.
Snusmumriken
Вдобавок, os.rename возвращает два аргумента: success и error_text. Их тоже можно вывести ))
Заха́р
А путь до директории ты куда дел? Используй абсолютные пути когда это возможно. Первое что ты должен сделать прежде чем задавать вопросы — вывести содержимое params[1] и file .. e. Посмотреть, что ты переименовываешь и во что. Я ведь не гадалка, и ты тоже. Если нет print'а для отладки — записывай в лог-файл, или если есть — посмотри аналог MsgBox.
В params[1] файловый менеджер передаёт через параметры полный путь к выделенным файлам (т. е. переменное значение). file .. e .. e — это расширение, а вот file — я не знаю. Думал это внутренняя функция какая-то. Что он должен в себе содержать? Я там в приведённых примерах вывел вообще весь код. Т. е. это не фрагмент.
Snusmumriken
Нет.
Snusmumriken
"вывести содержимое " — имеется ввиду не "описание того что делает код", это и так все знают, а что там конкретно в строке. Что будет если это вывести print'ом или аналогом.
Snusmumriken
В этой твоей фиговине есть print? Если нет — см "Если нет print'а для отладки — записывай в лог-файл, или если есть — посмотри аналог MsgBox"
Заха́р
эм... могу например через консоль прогнать.. Там же должен быть канпилятор какой-нить консольный для луа? Могу поставить что надо.
Заха́р
Что посоветуешь?