• XSS.stack #1 – первый литературный журнал от юзеров форума

Помогите решить задачу

likaku

(L1) cache
Пользователь
Регистрация
09.09.2020
Сообщения
519
Реакции
526
Выручайте, парни! Кто хорошо разбирается в регулярных выражениях.
Есть примерно такой текст, где в начальной строке стоит текст между <n> и </n>. А все строки ниже начинаются с <numb> и их может быть разное количество


Код:
<n>Александр</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>


Нужно с помощью регулярных выражений (найти и заменить) скопировать текст, который находится между <n> и </n>, и вставить его во все строки ниже между <fin> и </fin>.
Чтоб стало вот так:

Код:
<n>Александр</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>

Все варианты решения подобной задачи, которые я находил, вставляют текст только в одну строку. А нужно во все (
 
В несколько шагов через текстовую утилиту для редактирования текста не подходит?
Проблема в том, что таких файлов около 100к. И в каждом значение между <n> и </n> разное.
 
Можно сделать макрос для EmEditor'а
я не против, главное чтоб он не повис при обработке кучи файлов. Или может bat какой то
Лучше если б было что для PowerGrep. Он жрет любые объемы
 
Можно сделать макрос для EmEditor'а
если задачу упростит, можно убрать все переносы строк в файле и вся конструкция будет в одной строке.

Код:
<n>Александр</n><numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin><numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin><numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin><numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
 
Ну или так
Скрытый контент для пользователей: likaku.


input
Код:
<n>Александр</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<n>SummerTime</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>

output
Код:
<n>Александр</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<n>SummerTime</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>SummerTime</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>SummerTime</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>SummerTime</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>SummerTime</fin>
 
Ну или так
Скрытое содержимое

input
Код:
<n>Александр</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<n>SummerTime</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin></fin>

output
Код:
<n>Александр</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>Александр</fin>
<n>SummerTime</n>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>SummerTime</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>SummerTime</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>SummerTime</fin>
<numb>тут какой то текст</numb><pro>тут тожекакой то текст</pro><fin>SummerTime</fin>
Это для питона что-то? Если так, то у меня питон никакой не устанавливается (
 
Это для питона что-то? Если так, то у меня питон никакой не устанавливается (
C++ собери любым компилятором (ну почти). Если надо могу тебе сбилдить
 
C++ собери любым компилятором (ну почти). Если надо могу тебе сбилдить
ну, если не сложно... Думаю, эта утилитка не мне только пригодится может. Может кто-то тоже будет мучиться с аналогичной ситуацией, а тут бац и решение ) Спасибо!
 
Я бы так сделал. 1) обьеденил все файлы с помощью cmd copy 2) в emeditor убрал все переносы строк: типа заменить \n<numb> на <numb> 3) по миллиону вырезал и вставил в эксель с разделителями < и >. 4) скопировал нужный столбец 5) результат в емедиторе чищу от табуляции и сохраняю как исходный файл
 
Я бы так сделал. 1) обьеденил все файлы с помощью cmd copy 2) в emeditor убрал все переносы строк: типа заменить \n<numb> на <numb> 3) по миллиону вырезал и вставил в эксель с разделителями < и >. 4) скопировал нужный столбец 5) результат в емедиторе чищу от табуляции и сохраняю как исходный файл
это никак не подойдет. Файлов много (около 100к). В каждом из них значение между n разное
 
накидал по-быстрому:
JavaScript:
const fs = require('fs');
const path = require('path')
const readline = require('readline');

String.prototype.xssSplice = function (offset, text, removeCount = 0) {
    const calculatedOffset = offset < 0 ? this.length + offset : offset

    return this.substring(0, calculatedOffset) +
        text + this.substring(calculatedOffset + removeCount)
};

const getName = (str) => {
    const nameWithTags = str.match(/<n>[а-яё]+<\/n>/i)[0]
    const nameClear = nameWithTags.replaceAll(/<n>|<\/n>/g, "")

    return nameClear
}

const addText = (str, tag, insertText) => {
    const tagLength = tag.length
    const tagIndex = str.indexOf(tag)
    const spliceIndex = tagIndex + tagLength
    const newStr = str.xssSplice(spliceIndex, insertText)

    return newStr
}

const writeContentToFile = (filePath, outputPath) => {
    let name;
    let newStr;
    let isFirstLine = false

    const fileName = path.basename(filePath)
    const fileStream = fs.createReadStream(filePath)

    const readInterface = readline.createInterface({
        input: fileStream
    });

    readInterface.on('line', (line) => {
        if (!isFirstLine) {
            name = getName(line)
            isFirstLine = true
            newStr = line
        }
        else {
            newStr = addText(line, "<fin>", name)
        }

        fs.appendFileSync(`${outputPath}/${fileName}`, `${newStr}\n`)
    });

    readInterface.on("close", () => {
        const str = `обработка ${fileName} закончена успешно`
        console.log(str)
    })
}

const enumerateFiles = (inputPath, outputPath) => {
    fs.readdir(inputPath, (err, files) => {
        if (err) {
            console.error("не получается перечислить файлы в директории", err);
            process.exit(1);
        }

        files.forEach((file) => {
            const filePath = path.join(inputPath, file)
            writeContentToFile(filePath, outputPath)
        })
    })
}


const main = () => {
    const args = process.argv
    const inputPath = args[2]
    const outputPath = args[3]

    enumerateFiles(inputPath, outputPath)
}

main()
Если так, то у меня питон никакой не устанавливается (
надеюсь, что ноду сможешь установить hxxps://nodejs.org/en/download ))

запускать так:
node <filename>.js <input_folder_name> <output_folder_name>

к примеру:
node idx.js ./files ./output-files
 
Последнее редактирование:
накидал по-быстрому:
JavaScript:
const fs = require('fs');
const path = require('path')
const readline = require('readline');

String.prototype.xssSplice = function (offset, text, removeCount = 0) {
    const calculatedOffset = offset < 0 ? this.length + offset : offset

    return this.substring(0, calculatedOffset) +
        text + this.substring(calculatedOffset + removeCount)
};

const getName = (str) => {
    const nameWithTags = str.match(/<n>[а-яё]+<\/n>/i)[0]
    const nameClear = nameWithTags.replaceAll(/<n>|<\/n>/g, "")

    return nameClear
}

const addText = (str, tag, insertText) => {
    const tagLength = tag.length
    const tagIndex = str.indexOf(tag)
    const spliceIndex = tagIndex + tagLength
    const newStr = str.xssSplice(spliceIndex, insertText)

    return newStr
}

const writeContentToFile = (filePath, outputPath) => {
    let name;
    let newStr;
    let isFirstLine = false

    const fileName = path.basename(filePath)
    const fileStream = fs.createReadStream(filePath)

    const readInterface = readline.createInterface({
        input: fileStream
    });

    readInterface.on('line', (line) => {
        if (!isFirstLine) {
            name = getName(line)
            isFirstLine = true
            newStr = line
        }
        else {
            newStr = addText(line, "<fin>", name)
        }

        fs.appendFileSync(`${outputPath}/${fileName}`, `${newStr}\n`)
    });

    readInterface.on("close", () => {
        const str = `обработка ${fileName} закончена успешно`
        console.log(str)
    })
}

const enumerateFiles = (inputPath, outputPath) => {
    fs.readdir(inputPath, (err, files) => {
        if (err) {
            console.error("не получается перечислить файлы в директории", err);
            process.exit(1);
        }

        files.forEach((file) => {
            const filePath = path.join(inputPath, file)
            writeContentToFile(filePath, outputPath)
        })
    })
}


const main = () => {
    const args = process.argv
    const inputPath = args[2]
    const outputPath = args[3]

    enumerateFiles(inputPath, outputPath)
}

main()

надеюсь, что ноду сможешь установить hxxps://nodejs.org/en/download ))

запускать так:
node <filename>.js <input_folder_name> <output_folder_name>

к примеру:
node idx.js ./files ./output-files
Спасибо! (лайки закончились). Проблема уже решена, Грач помог
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх