Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Три строки (http://forum.oszone.net/showthread.php?t=341559)

Freddy1984 26-07-2019 12:43 2881432

Три строки
 
Здравствуйте!
Помогите пожалуйста с реализацией переподвыподверта :help: .
Есть текстовый файл. В нем может попадаться три строки с одинаково начинающимся словом.
Нужно сделать так, что бы в случае нахождения трёх идущих по очереди строк (с одинаковым первым словом), первая и третья удалялись, а оставалась только центральная.
То есть удалялись первая и третья только в том случае, если они идут подряд одна за другой.

Пример текста в файле:

Действия баз данных
Автоматизация действий и базы данных
Программирование, базы данных, и много всего
Программирование, базы данных и автоматизация действий
Программирование, базы данных
Скриптовые языки администрирования Windows
Программирование, базы данных и автоматизация действий
Языки администрирования Windows


ТРИ строки начинающиеся со слова "Программирование" идут подряд. Если таковое в наличии в файле, то удаляем "Программирование, базы данных, и много всего" и "Программирование, базы данных". Оставляем только "Программирование, базы данных и автоматизация действий".

Буду очень признателен, если это возможно сделать на CMD. :hi:

Busla 26-07-2019 13:11 2881438

Цитата:

Цитата Freddy1984
трёх одинаковых идущих по очереди строк, первая и третья удалялись, а оставалась только центральная. »

если строки одинаковые - какая разница: которую удалять?

Freddy1984 26-07-2019 13:27 2881442

Цитата:

Цитата Busla
если строки одинаковые - какая разница: которую удалять? »

Я прошу прощения, может не совсем корректно выразился. Имеется в виду три строки с одинаково начинающимся словом.
На примере я более подробно всё показал.

Freddy1984 26-07-2019 14:28 2881452

Цитата:

Цитата megaloman
А если 4 строки начинается с одного слова? А 5? »

Лично в моём случае этого не будет.
У меня либо одна, либо три. Если три, то первую и третью надо удалить.

Sham 26-07-2019 14:30 2881453

так что-ли? https://regex101.com/r/RcQmDw/1

Freddy1984 26-07-2019 14:49 2881456

Цитата:

Цитата Sham
так что-ли? »

похоже что так, а в CMD это можно как то перевести. это на php как я понял? :)

Busla 26-07-2019 14:55 2881458

Цитата:

Цитата Freddy1984
в удобоваримую форму это можно как то вывести? »

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

Freddy1984 26-07-2019 14:57 2881460

ок, если под CMD никак, то ясно. Спасибо что откликнулись.

megaloman 26-07-2019 15:10 2881463

ок, если под CMD как. Если только в тексте нет всяких спецсимволов
Код:

@Echo Off
cls
chcp 1251 >nul
        Set "FileIn=Z:\Box_In\Есть текстовый файл.txt"
       
        If Not Exist "%FileIn%" (Echo !!! File "%FileIn%" not found &Pause &Exit /b 2)

        Set /A N=10000000
        Set /A NN=0

        FOR /F "usebackq tokens=1* delims=:" %%i IN (`2^>nul FINDSTR /N /R /C:"^.*" "%FileIn%"`) DO (
                Set /A NN=%N%+%%i
                Call Set "@@@%%NN%%=%%j"
        )

        If %NN%==0 (Echo !!! No string in "%FileIn%" &Pause &Exit /B 1)

        Set /A M1=%N%
        :Begin
                Set /A M1+=1
                Set /A M2=%M1%+1, M3=%M1%+2

                If %M3% GTR %NN% GoTo :End
               
                Call :Word1 "%%@@@%M1%%%" "W1"
                Call :Word1 "%%@@@%M2%%%" "W2"
                Call :Word1 "%%@@@%M3%%%" "W3"

                If /I "%W1%"=="%W2%" If /I "%W1%"=="%W3%" (
                        Set "@@@%M1%="
                        Set "@@@%M3%="
                        Set /A M1=%M3%
                )
                GoTo :Begin
        :End

        >"%FileIn%" (FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@@@"`) DO Echo %%j)
Pause
Exit /B

:Word1
        FOR /F "tokens=1 delims=,.:!?- " %%w IN (%1) DO Set "%~2=%%w"
Exit /B 0


DJ Mogarych 26-07-2019 23:20 2881524

Цитата:

Цитата Sham

Если этот ужас адаптировать для Select-String -pattern "_ужас_" в powershell, то это, видимо, и будет искомое.
Я не смог распарсить с непривычки.

Iska 26-07-2019 23:45 2881529

DJ Mogarych, а нужно ли здесь Select-String?

Busla 26-07-2019 23:57 2881532

Iska, командлеты PowerShell - это и есть нормальное использование PowerShell, а не ваше любимое прямое обращение к методам и классам .NET

Iska 27-07-2019 00:48 2881544

Busla, я имел в виду простой оператор -replace.

DJ Mogarych 27-07-2019 06:54 2881554

Iska, может, и не нужно.
Кстати, приведённый регекс не работает в таком примере:
Цитата:

Действия баз данных
Автоматизация действий и базы данных
Программирование, базы данных, и много всего
Программирование, базы данных и автоматизация действий
Программирование, базы данных
Скриптовые языки администрирования Windows
Программирование, базы данных и автоматизация действий
Языки администрирования Windows, раз
Языки администрирования Windows, два
Языки администрирования Windows, три

Sham 27-07-2019 08:55 2881568

Цитата:

Цитата DJ Mogarych
не работает »

потому что в конце переноса нет.
С m-флагом и якорем на порядок производительнее https://regex101.com/r/RcQmDw/3


Время: 23:23.

Время: 23:23.
© OSzone.net 2001-