Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Текстовый редактор с поддержкой макросов  (Прочитано 7864 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Nick222

  • Автор темы
  • Активист
  • *
  • Сообщений: 622
    • Просмотр профиля
Здравствуйте!

Xubuntu 24.10

Задача - есть много текстовых файлов в разных папках.
Внутри файлов в некоторой формализованной строке есть число.

Нужно сначала взять это число и использовать для переименования данного файла.

Затем нужно взять имя папки, где лежит данный файл, а также имя папки более высокого уровня, составить из них + из имени файла определённую строку, и её записать внутрь данного файла в определённое место (по номеру строки).

Понятно, что для этого можно написать программу.

Но есть ли более простой способ сделать это?
Например, какой-либо не очень сложный текстовый редактор с поддержкой подобных макросов, позволяющий переименовывать файл, понимающий, что такое "номер строки" и т.п.

Или ещё задача - при импорте текстовых файлов абзацы развалились на отдельные строки - нужно их снова собрать (т.е. убрать лишние разрывы строк, кроме тех, что после точки или другого знака препинания, и заменить их пробелами - и т.п.).

Спасибо большое :)
Xubuntu 25.04

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7840
  • Eternally
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #1 : 04 Декабря 2024, 02:10:58 »
Понятно, что для этого можно написать программу.
Скрипта, думаю, достаточно.

Например, какой-либо не очень сложный текстовый редактор с поддержкой подобных макросов
А такие вообще существуют в природе? Видели такое на других ОС?
Так-то под Windows и на VBA можно чего-то простенькое набросать.

Задача - есть много текстовых файлов в разных папках.
Внутри файлов в некоторой формализованной строке есть число.
Примеры, пожалуйста. Я вот вообще не понимаю, что вы подразумеваете под "формализованной" строкой. NUL-байт, или слэши, или иероглиф катаканы ヅ на позиции Ω в 27-й день лунного календаря 🌔?

при импорте текстовых файлов абзацы развалились на отдельные строки
импортируйте заново, учитывая этот момент.

Учитесь задавать вопросы:
- Чётко сформулируйте задачу, без абстракций и отсебятины. Приведите конкретные примеры.
- Если самостоятельно пробовали справиться с задачей, но что-то пошло не так - расскажите что именно делали и что конкретно не получилось.
« Последнее редактирование: 04 Декабря 2024, 02:41:10 от ALiEN »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Nick222

  • Автор темы
  • Активист
  • *
  • Сообщений: 622
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #2 : 04 Декабря 2024, 02:40:43 »
Примеры, пожалуйста
Цитировать
6: {text: '
Это начало строки. Данная строка - первая не пустая в файле - после первых 5 строк технической информации, которые менять нельзя и которые могут быть любыми.
Это день месяца (без ведущего нуля). Соответственно, число может быть от 1 до 31.
Нужно добавить при необходимости ведущий ноль и переименовать файл.

Если при этом получится автоматически удалить данный кусок текста, а также удалить в конце файла
Цитировать
'}
то будет вообще замечательно.

***

Про импорт - к сожалению, источник импорта текстовых файлов был утерян.
Нужно просто существенно снизить объём необходимой ручной работы по правке и приведению файлов в норму - не стоит задача сделать всё 100% правильно.
Xubuntu 25.04

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7840
  • Eternally
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #3 : 04 Декабря 2024, 02:59:12 »
т.е. Взять информацию с шестой строки и её удалить? и как переименовывать?
Файл 6.txt ?
Или файл 6: {text: '.txt ?

Сам-то файл будет полностью, или как?
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 04 Декабря 2024, 03:09:02 от ALiEN »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 8047
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #4 : 04 Декабря 2024, 06:03:02 »
не очень сложный текстовый редактор с поддержкой подобных макросов
Mcedit. А насколько подобный, разбирайся сам.

Да и подобие скрипта (user menu) создать и запустить в mc очень просто.

Оффлайн Nick222

  • Автор темы
  • Активист
  • *
  • Сообщений: 622
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #5 : 04 Декабря 2024, 13:36:17 »
Извините, писал ночью, туго соображал.
Файл приложил.

Нужно взять то число, что стоит до двоеточия в процитированной мной выше строке (она может находиться на разных местах, но между строкой
Цитировать
====== zagolovok ======
и ней всегда только пустые строки) и это число (добавив ведущий ноль при необходимости - т.е. если число от 1 до 9) сделать новым именем файла.

Т.о. в данном примере из файла 03.txt сделать 06.txt.

***

Но т.к. файл лежит в папке "05", которая в свою очередь находится в папке "2014", то в конце концов имя файла должно стать 2014-05-06.txt.

***

Спасибо за MCEdit :)
« Последнее редактирование: 05 Декабря 2024, 01:17:21 от Nick222 »
Xubuntu 25.04

Оффлайн Skif_off

  • Активист
  • *
  • Сообщений: 454
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #6 : 05 Декабря 2024, 01:20:55 »
Макросы в текстовых редакторах - это вроде обычно тупо запись порядка нажатия клавиш, не?
Если дело массовое, ИМХО, проще пытаться решать на уровне файлового менеджера или обнаж голой консоли.

Оффлайн Nick222

  • Автор темы
  • Активист
  • *
  • Сообщений: 622
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #7 : 05 Декабря 2024, 12:55:19 »
Желательно обрабатывать это прямо в программе (Zim-wiki) - она позволяет запускать скрипты изнутри себя (но макросов там нет).

Но я пока даже не могу переименовать файл простым mv в этой программе почему-то (может она запирает файл при редактировании?).

Так что придётся, видимо, изменять файл "извне".
К тому же важен визуальный контроль за результатами изменений.
Xubuntu 25.04

Оффлайн Skif_off

  • Активист
  • *
  • Сообщений: 454
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #8 : 07 Декабря 2024, 01:50:15 »
Цитировать
есть много текстовых файлов в разных папках.
...
К тому же важен визуальный контроль за результатами изменений.
Звучит как противоречие :)
Но я пока даже не могу переименовать файл простым mv в этой программе почему-то
Попробовал с новым именем из выделенного текста
mv %s %t.txtВроде срабатывает.

У Zim большое сообщество? Возможно, под проблему с развалившимися абзацами кто-то плагин набросал?

Файлы всегда в UTF-8 и перевод строки "\n" (LF)?

Пользователь добавил сообщение 07 Декабря 2024, 08:45:13:
Как вариант, сохранить с расширением lua в UTF-8 без BOM:
-- (cross-platform)
--2024.12.09
--[[
Details: https://forum.ubuntu.ru/index.php?topic=322585.0
]]

local params = {...}

local function GetEOL(sF)
  local h = io.open(sF, "rb")
  if h == nil then return nil end
  local sC = h:read(100)
  h:close()
  if string.find(sC, "\r\n", 1, true) ~= nil then return "\r\n" end
  if string.find(sC, "\r", 1, true) ~= nil then return "\r" end
  return "\n"
end

local function BackUp(sF)
  local sUT = os.time()
  os.rename(sF, sF .. "-" .. sUT .. ".bak")
end

local function FileExists(sF)
  local h = io.open(sF, "rb")
  if h == nil then
    return false
  else
    h:close()
    return true
  end
end

local function GetUniqueName(sP, sN, sE)
  local iC = 2
  local sR = sP .. sN .. sE
  if FileExists(sR) == true then
    while true do
      sR = sP .. sN .. "(" .. iC .. ")" .. sE
      if FileExists(sR) == false then break end
      iC = iC + 1
    end
  end
  return sR
end

local function SplitName(sF)
  local aR = {}
  for n in string.gmatch(sF, "[^\\/]+") do table.insert(aR, n) end
  return aR
end

local function CreationDate(sN)
  local aM = {"января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"}
  local aW = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"}
  local dt = {}
  dt.year, dt.month, dt.day = string.match(sN,"(%d%d%d%d)%-(%d%d)%-(%d%d)")
  if dt.year == nil then return nil end
  for k, v in pairs(dt) do dt[k] = tonumber(v) end
  local sT = os.date("%m, %w", os.time(dt))
  local iM, iW = string.match(sT,"(%d+), (%d+)")
  iM = tonumber(iM)
  iW = tonumber(iW)
  return "Создано " .. aW[iW + 1] .. " " .. dt.day .. " " .. aM[iM] .. " " .. dt.year
end

local PathDelim
if string.find(package.path, "\\", 1, true) ~= nil then
  PathDelim = "\\"
else
  PathDelim = "/"
end
local aFile = SplitName(params[1])
local sEOL = GetEOL(params[1])

local h = io.open(params[1], "r")
if h == nil then return end
local aText = {}
local iC = 1
for l in h:lines() do
  l = string.gsub(l, "[\r\n]+$", "")
  aText[iC] = l
  iC = iC + 1
end
h:close()

local sTmp, iTitle
iC = 1
while true do
  if iC > #aText then break end
  if string.sub(aText[iC], 1, 7) == "====== " then
    iTitle = iC
    break
  end
  iC = iC + 1
end
if iC >= #aText then return end
iC = iC + 1
while true do
  if iC > #aText then break end
  sTmp = string.match(aText[iC], "^(%d+): {text: '")
  if sTmp ~= nil then
    aText[iC] = string.gsub(aText[iC], "^%d+: {text: '", "", 1)
    break
  end
  iC = iC + 1
end
if sTmp == nil then return end
if string.len(sTmp) == 1 then sTmp = "0" .. sTmp end

if aText[#aText] == "'}" then
  aText[#aText] = ""
else
  if aText[#aText - 1] == "'}" then
    aText[#aText - 1] = ""
    table.remove(#aText, #aText)
  end
end

local sName = aFile[#aFile - 2] .. "-" .. aFile[#aFile - 1] .. "-" .. sTmp

if iTitle ~= nil then
  sTmp = CreationDate(sName)
  if sTmp ~= nil then
    table.insert(aText, iTitle + 1, sTmp)
  end
end

local sPath = table.concat(aFile, PathDelim, 1, #aFile - 1) .. PathDelim
if PathDelim == "/" then sPath = "/" .. sPath end
local sFile = GetUniqueName(sPath, sName, ".txt")

sTmp = table.concat(aText, sEOL)
h = io.open(sFile, "wb")
h:write(sTmp)
h:close()

BackUp(params[1])

Понадобится пакет lua5.1 или luajit (второй в теории пошустрее), запуск соответственно
lua5.1 скрипт %sили
luajit скрипт %sВ теории кроссплаиформенный, но проверял только в Linux.

Если при этом получится автоматически удалить данный кусок текста, а также удалить в конце файла
Цитировать
'}
то будет вообще замечательно.
Вроде получилось.

Если найдена строка с "N: {text: '", то поправленное содержимое сохраняется в новый файл с нужным именем, оригинальный файл переименовывается в "староеимя-unuxtime.bak".
Последняя и предпоследняя строки проверяются на "'}", во втором случае с очисткой "'}" скрипт удаляет и последнюю строку.

Содержимое файла читается построчно в таблицу и чтобы не похерить тип окончания строки, предварительно считывается 100 байт для поиска (но это txt'шники Zim и по идее они не могут быть пустыми).

Если под Linux имя файла или папки может содержать "\", будут сюрпризы, надо будет как-то переделать получение нового имени.
На всякий случае разделитель каталогов ("\" или "/") определяется по значению package.path.

Но т.к. файл лежит в папке "05", которая в свою очередь находится в папке "2014", то в конце концов имя файла должно стать 2014-05-06.txt.
Возможно ли такое, что в папке уже будет файл с нужным именем? Такое не предусмотрено и нужно будет подумать, как обходить.

Уф, вроде всё сказал, уточню на всякий: AS IS и т.д., если скрипт не будет сначала проверен на тестовой копии, то ССЗБ :)
« Последнее редактирование: 09 Декабря 2024, 00:52:34 от Skif_off »

Оффлайн Nick222

  • Автор темы
  • Активист
  • *
  • Сообщений: 622
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #9 : 07 Декабря 2024, 14:05:31 »
Извините, я буду отвечать постепенно - дополняя данный пост.

Звучит как противоречие

Я имел ввиду - сейчас сразу исправить все такие существующие файлы + сделать возможность разового применения скрипта на будущее.
Хотя, может быть, безопаснее с точки зрения сохранности данных будет только разовый скрипт.

mv %s %t.txt

Да, спасибо, работает. Только нужно учитывать ограничения на имена заметок в Zim - заменять пробелы и т.п.

Возможно, под проблему с развалившимися абзацами кто-то плагин набросал?

Вряд ли кто-то ещё из сообщества Zim занимался такой же глупостью, как я с этим импортом. :)
Проще накатать скрипт - абзац только после точки, а остальное - пробелы.
Всё равно придётся проверять глазами и подправлять руками.
Буду изучать lua :)

Возможно ли такое, что в папке уже будет файл с нужным именем? Такое не предусмотрено и нужно будет подумать, как обходить.

Сейчас такого в принципе нет, но проверка, конечно, нужна.

***

Теперь буду разбираться со скриптом...

Спасибо большое :)

PS: У меня последний lua5.4
« Последнее редактирование: 07 Декабря 2024, 14:18:16 от Nick222 »
Xubuntu 25.04

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 8047
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #10 : 07 Декабря 2024, 14:22:14 »
Всё равно придётся проверять глазами и подправлять руками.
Не порть оригиналы.  Где-нибудь на полпути вполне может оказаться, что проще и быстрей из оригиналов всё сделать глазами и руками, чем править испорченное.
Особенно с учётом, что это нужно один раз.

Оффлайн Nick222

  • Автор темы
  • Активист
  • *
  • Сообщений: 622
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #11 : 07 Декабря 2024, 18:48:21 »
Запуск скрипта:

Цитировать
luajit: 111.lua:82: attempt to concatenate a nil value
stack traceback:
   111.lua:82: in main chunk
   [C]: at 0x5b7b10cbc380
Xubuntu 25.04

Оффлайн Skif_off

  • Активист
  • *
  • Сообщений: 454
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #12 : 07 Декабря 2024, 20:40:54 »
Вряд ли кто-то ещё из сообщества Zim занимался такой же глупостью, как я с этим импортом.
Но импорт вроде штатная фича?
Цитировать
attempt to concatenate a nil value
Странно, в этой строке есть sTmp, то самое число, но если оно не найдено, то до 82 строки дело бы просто не дошло, и таблица aFile - полное имя файла, порезанное по "/" и/или "\". Проблема скорее со вторым, но непонятно, как полное имя файла может содержать в себе менее двух папок. Только если txt'шник лежит в / или под Win в корне диска, наверное.
Полное имя файла как выглядит?

Оффлайн Nick222

  • Автор темы
  • Активист
  • *
  • Сообщений: 622
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #13 : 07 Декабря 2024, 21:14:39 »
штатная фича
Я импортировал из Rednotebook, а там записи упакованы в отдельные файлы по месяцам, для Zim требовалось порезать на дни. Делал руками, по-моему, или через промежуточную программу CherryTree. Это было 12 лет назад, я уже забыл, честно говоря.

Я работаю под Linux (Xubuntu), полное имя файла было ~/TMP/05.txt.
Xubuntu 25.04

Оффлайн Skif_off

  • Активист
  • *
  • Сообщений: 454
    • Просмотр профиля
Re: Текстовый редактор с поддержкой макросов
« Ответ #14 : 07 Декабря 2024, 23:19:39 »
Nick222, версия номер два: в терминале путь к 05.txt указывался неполный/относительный, т.к. как есть "~/TMP/05.txt"? Скрипт затачивался под %s, т.е. каноничный полный путь.

Похоже, всё-таки вопрос за переносы кто-то уже поднимал: Remove line breaks custom tool.

 

Страница сгенерирована за 0.021 секунд. Запросов: 21.