Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Заменить ссылки в txt файле, найдя одинаковые номера

Ответить
Настройки темы
Любой язык - [решено] Заменить ссылки в txt файле, найдя одинаковые номера

Ветеран


Сообщения: 539
Благодарности: 4

Профиль | Отправить PM | Цитировать


Здравствуйте, подскажите как сделать такое на powershell или bath ?

есть несколько txt файлов.. в каждом txt ссылки одного из нескольких типов..

пример одного из типов:

Код: Выделить весь код
https://google.com/file/6c616b50641a8/0001start.mp4
https://google.com/file/f0bafe33ee86d/0002start.mp4
https://google.com/file/82c4d96027879/0003start.mp4
https://google.com/file/2ca5c2ed414b6/0004start.mp4
https://google.com/file/8e616f8c54ce8/0005start.mp4
https://google.com/file/484651ad8773a/0006start.mp4
https://google.com/file/a0abb050c39f5/0007start.mp4
https://google.com/file/e93fb78dbcfcf/0008start.mp4
https://google.com/file/613bf9cc27632/0009start.mp4
https://google.com/file/e95ba702a2557/0010start.mp4
https://google.com/file/c7f25a80f361d/0011start.mp4
https://google.com/file/deletelink/0012start.mp4
https://google.com/file/bd95035d50f7a/0013start.mp4
https://google.com/file/deletelink/0014start.mp4
https://google.com/file/c5b0e8bc53652/0015start.mp4
https://google.com/file/deletelink/0016start.mp4
https://google.com/file/2ca4038062eb9/0017start.mp4
https://google.com/file/deletelink/0018start.mp4
https://google.com/file/976582ec7e383/0019start.mp4
https://google.com/file/20ab0d8a2856c/0020start.mp4
https://google.com/file/deletelink/0021start.mp4
https://google.com/file/df3b1c7694b27/0022start.mp4
https://google.com/file/deletelink/0023start.mp4
https://google.com/file/deletelink/0024start.mp4
https://google.com/file/9ce184ff0b163/0025start.mp4
https://google.com/file/es5gscfcf/0008start.mp4
https://google.com/file/c5bfgju3652/0015start.mp4
https://google.com/file/dwtgink/0021start.mp4
бывают txt с другими типами.. отличие в основном в имени файла, расширения разные, есть txt где в имени файла присутствует знак земли _ (примеры типов имен файлов.. 0024start.mp4, start0024.mp4, 0024start_m.jpg, start0024_m.jpg (буква после земли может быть другая).
Но как я говорил в одном txt файлы только какого - нибудь одного типа, необходимо либо несколько скриптов под разные типы файлов, либо один универсальный (если это возможно).
Теперь к тому, что должен делать скрипт

в каждом txt файле список ссылок, в конце которых есть имя файла... в составе имени файла обязательно есть номер, состоящий из 4ех цифр... номер этих цифр идет по порядку, начиная с 0001 (0001 - первая ссылка, 0002 - вторая ссылка, 0003 третья ссылка и т.д.). В какой то момент порядок нарушается, и идут ссылки, которые должны заменить тех, что выше (находить тех, которых заменить нужно по номеру), ссылка должна замениться полностью.

Другими словами нужно выполнить замену ссылок со старых на новые.. старые выше, новые ниже, определять по 4ех значному номеру в имени файла. За место старых ссылок должны встать новые, а новые со своих мест (снизу) удалиться. Дубликатов в новых ссылках не будет, номера у них будут разные.. такие же номера 100% будут в старых ссылках. txt файлы должны заменится на новые после применения скрипта. Из примера выше, после применения скрипта, txt файл должен стать таким..


Код: Выделить весь код
https://google.com/file/6c616b50641a8/0001start.mp4
https://google.com/file/f0bafe33ee86d/0002start.mp4
https://google.com/file/82c4d96027879/0003start.mp4
https://google.com/file/2ca5c2ed414b6/0004start.mp4
https://google.com/file/8e616f8c54ce8/0005start.mp4
https://google.com/file/484651ad8773a/0006start.mp4
https://google.com/file/a0abb050c39f5/0007start.mp4
https://google.com/file/es5gscfcf/0008start.mp4
https://google.com/file/613bf9cc27632/0009start.mp4
https://google.com/file/e95ba702a2557/0010start.mp4
https://google.com/file/c7f25a80f361d/0011start.mp4
https://google.com/file/deletelink/0012start.mp4
https://google.com/file/bd95035d50f7a/0013start.mp4
https://google.com/file/deletelink/0014start.mp4
https://google.com/file/c5bfgju3652/0015start.mp4
https://google.com/file/deletelink/0016start.mp4
https://google.com/file/2ca4038062eb9/0017start.mp4
https://google.com/file/deletelink/0018start.mp4
https://google.com/file/976582ec7e383/0019start.mp4
https://google.com/file/20ab0d8a2856c/0020start.mp4
https://google.com/file/dwtgink/0021start.mp4
https://google.com/file/df3b1c7694b27/0022start.mp4
https://google.com/file/deletelink/0023start.mp4
https://google.com/file/deletelink/0024start.mp4
https://google.com/file/9ce184ff0b163/0025start.mp4
т.е. осталось 25 ссылок, идущих по порядку по номеру, остальные 3, которые были ниже, заменили собой тех, которые были выше, найдя их по номеру

Отправлено: 15:17, 14-12-2023

 

Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Нужно проверить, сравнить list-in.txt и list-out.txt, но вроде все корректно

Код: Выделить весь код
[uri[]] $urls = Get-Content list-in.txt
$urls | Group-Object { $_.Segments[-1] } | Foreach-Object { $_.Group[-1].OriginalString } | Set-Content list-out.txt
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:29, 14-12-2023 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 539
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
Нужно проверить, сравнить list-in.txt и list-out.txt, но вроде все корректно »
Спасибо, проверил через онлайн сервис сравнения двух тхт, все нормально.. А можно сделать, чтобы определяло именно по номеру файла, игнорируя имя и расширение? (ссылку также заменять полностью на новую).
и вопросик. если мне нужно таким образом проверить 50 txt файлов, и заменить оригиналы, на то, что результировал скрипт, нужно так делать?

Код: Выделить весь код
[uri[]] $urls = Get-Content list-in.txt
$urls | Group-Object { $_.Segments[-1] } | Foreach-Object { $_.Group[-1].OriginalString } | Set-Content list-in.txt
и перекопировать этот код 50 раз изменяя имена файлов? ничего не нарушится при этом?

Отправлено: 19:49, 14-12-2023 | #3


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата Alexander_88:
А можно сделать, чтобы определяло именно по номеру файла, игнорируя имя и расширение? »
Как-то так, опять же проверьте
Код: Выделить весь код
[uri[]] $urls = gc list-in.txt
$urls | group-object { $_.Segments[-1] -replace '(?<=\d4).+' } | % { $_.Group[-1].OriginalString } | sc list-out.txt
Цитата Alexander_88:
если мне нужно таким образом проверить 50 txt файлов, и заменить оригиналы, на то, что результировал скрипт, нужно так делать? »
Можно, нужно завернуть в цикл:

Код: Выделить весь код
$files = dir *.txt                     # Ваши *.txt файлы
foreach ($file in $files)
{
    [uri[]] $urls = Get-Content $file
    $urls | Group-Object { $_.Segments[-1] -replace '(?<=\d4).+' } | Foreach-Object {
        $_.Group[-1].OriginalString
    } | Set-Content $file             # перезаписывается исходный !!
}

Отправлено: 21:28, 14-12-2023 | #4


Ветеран


Сообщения: 539
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
Как-то так, опять же проверьте »
Спасибо, завтра обязательно проверю, сегодня уже нет возможности..


Цитата Foreigner:
Можно, нужно завернуть в цикл: »
а если пути файлов разные, я могу их через запятую перечислить? Пока не могу протестировать, только завтра... просто заранее спросил на всякий случай

Отправлено: 21:37, 14-12-2023 | #5


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата Alexander_88:
могу их через запятую перечислить? »
Да, можно.

Отправлено: 21:46, 14-12-2023 | #6


Ветеран


Сообщения: 539
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:21, 15-12-2023 | #7


Ветеран


Contributor


Сообщения: 2715
Благодарности: 1688

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@Echo Off &Cls
>nul Chcp 1251
SetLocal EnableDelayedExpansion
	Call :MyDir "Z:\Box_In\*.txt" "Z:\Box_Out" 
	Call :MyDir "Z:\Soft_In\*.txt" "Z:\Soft_In" 
Pause
Exit /B

:MyDir
	FOR %%f In (%1) DO Call :Replace "%%f" %2
Exit /B

:Replace
	Echo %1 -^> %2
	For /F "usebackq tokens=3 delims=:" %%i In (`2^>nul Find /C ":" %1`) Do Set /A N=%%i
	If %N% EQU 0 (Exit /B 1)
	Set /A N+=10000
	>"%~2\%~nx1.tmp" (For /L %%i In (10001,1,%N%) Do (
		Set /A M=%%i
		Set "M=/.*!M:~1!.*\..*"
		Set "SS="
		For /F "usebackq delims=" %%s In (`2^>nul FindStr /R /E /C:"!M!" %1`) Do Set "SS=%%s"
		If Not "!SS!"=="" (Echo !SS!)
	))
	>nul Move /Y "%~2\%~nx1.tmp" "%~2\%~nx1"
Exit /B
Скрипт просматривает файлы по указанной маске в указанной папке и помещает результаты в другую папку.
Папки могут и совпадать
A если пути файлов разные для каждого пишем свой Call :MyDir

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 16-12-2023 в 18:20.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:13, 16-12-2023 | #8


Ветеран


Сообщения: 539
Благодарности: 4

Профиль | Отправить PM | Цитировать


megaloman, спасибо, попробовал, теперь расширение и имя игнорирует как и нужно, только дольше обрабатывает 1 файл для теста попробовал (800 ссылок), и почему то сбивает сортировку..
все выводится не по порядку по номерам.. к примеру первые 5 строк с номерами файлов:

0625
0002
0628
0004
0102

Отправлено: 17:02, 17-12-2023 | #9


Ветеран


Сообщения: 539
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата Alexander_88:
Foreigner, попробовал второй вариант, но как будто бы ничего не поменялось.. »
заметил, что строк стало меньше почему то

Отправлено: 17:58, 17-12-2023 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Заменить ссылки в txt файле, найдя одинаковые номера

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Посчитать одинаковые значения в txt ivan.vas Скриптовые языки администрирования Windows 4 05-10-2021 16:53
CMD/BAT - [решено] Выборка и txt по списку в txt файле cyberp1983 Скриптовые языки администрирования Windows 5 24-05-2018 20:27
Любой язык - [решено] Заменить ссылки в одном тхт файле, взяв их из другого Alexander_88 Скриптовые языки администрирования Windows 2 14-02-2016 09:25
Любой язык - [решено] заменить ссылки из одного тхт на ссылки в другом тхт Alexander_88 Скриптовые языки администрирования Windows 4 11-10-2015 16:46
CMD/BAT - [решено] Заменить фамилию в .txt файле Помогите! doorsman Скриптовые языки администрирования Windows 8 28-03-2012 00:14




 
Переход