Компьютерный форум 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=351284)

ioSIS 26-05-2022 20:55 2985812

Разбить строку, содержащую кавычки, на несколько.
 
Здравствуйте, форумчане!
Прошу помощи в разработке скрипта.

Имеется строка вида:

Код:

1|Russian|Dub, Blu-ray CEE}}}2|Ukrainian|DVO}}}3|Russian|MVO, "DVD Magic"}}}4|Russian|VO, Gotlib}}}5|English}}}
Нужно разбить ее на строки по разделителю "}}}", чтобы получилось:

Код:

1|Russian|Dub, Blu-ray CEE
2|Ukrainian|DVO
3|Russian|MVO, "DVD Magic"
4|Russian | VO, Gotlib
5|English

В основной строке могут быть любые символы, включая кавычки.

DJ Mogarych 26-05-2022 21:01 2985813

Powershell:
Код:

# Предполагается, что строка находится в файле
(gc "C:\temp\string.txt") -replace '}}}','}' -split '}'


ioSIS 26-05-2022 21:43 2985816

Спасибо за это вариант.
А на CMD можно это сделать?
А то я в Powershell не шарю.

PS: Строка получена как вывод другой программы.

Fors1k 26-05-2022 22:05 2985818

Цитата:

Цитата ioSIS
А то я в Powershell не шарю. »

А чего тут шарить? Код же дали готовый, вам только запустить.
Цитата:

Цитата ioSIS
Строка получена как вывод другой программы. »

Напишите команду запуска той программы, тогда можно будет все в один скрипт объединить.

DJ Mogarych, только там получится один лишний вывод из-за скобок в конце, надо бы обрезать.
Код:

$str = '1|Russian|Dub, Blu-ray CEE}}}2|Ukrainian|DVO}}}3|Russian|MVO, "DVD Magic"}}}4|Russian|VO, Gotlib}}}5|English}}}'

$res = $str.Trim('}}}') -split '}}}'
$res


DJ Mogarych 26-05-2022 22:41 2985820

А я и забыл, что -split может несколько символов в качестве разделителя использовать.
cut в bash таких вольностей не позволяет, например.

Fors1k 26-05-2022 23:44 2985821

DJ Mogarych, ага. Да хоть регулярку)

ioSIS 27-05-2022 09:58 2985829

Цитата:

Цитата Fors1k
Напишите команду запуска той программы, тогда можно будет все в один скрипт объединить. »

Код:

MediaInfo.exe --Output=Audio;%StreamKindPos%^|%Language/String%^|%Title%}}} D:\1\Test_quotes.mkv
В выводе команды могут быть как двойные, так и одинарные кавычки.

Fors1k 27-05-2022 13:20 2985836

Код:

$mediaInfo = "D:\MediaInfo.exe"
$videoPath = "D:\Фмльмы\TheGame.HDR.mkv"

$audioInfo = .$mediaInfo "--Output=Audio;%StreamKindPos%|%Language/String%|%Title%}}}" $videoPath
[Text.Encoding]::UTF8.GetString([Console]::OutputEncoding.GetBytes($audioInfo)).Trim("}}}")-Split("}}}")

Вывод:
Код:

1|Russian|Dub, Пифагор/Кинопоиск HD
2|Russian|MVO, HDRezka Studio
3|Russian|DVO, Pazl Voice
4|English|


DJ Mogarych 27-05-2022 13:58 2985837

Цитата:

Цитата ioSIS
%Title%}}} »

Может, убрать эти фигурные скобки в конце, и их не нужно будет отрезать потом?

ioSIS 27-05-2022 16:05 2985840

Цитата:

Цитата DJ Mogarych (Сообщение 2985837)
Цитата:

Цитата ioSIS
%Title%}}} »

Может, убрать эти фигурные скобки в конце, и их не нужно будет отрезать потом?

Так они разделяют данные каждой дорожки. Без них простот склеится в одну строку, и как разделять потом?

DJ Mogarych 27-05-2022 17:40 2985845

Например, так:
Код:

1|Russian|Dub, Blu-ray CEE2|Ukrainian|DVO3|Russian|MVO, "DVD Magic"4|Russian|VO, Gotlib5|English

-split '(?=\d+\|)'

Более того, можно посмотреть и возможности самого экспорта MediaInfo по переносу строк, например, попробовать так:
Код:

--Output=Audio;%StreamKindPos%|%Language/String%|%Title%\n
Upd: да, так работает, можно обойтись вообще без доп. обработки.

megaloman 27-05-2022 18:57 2985849

ioSIS,
Цитата:

Цитата ioSIS
Нужно разбить ее на строки по разделителю "}}}", чтобы получилось: »

А зачем это нужно? Тут основная проблема - наличие |.
Я сымитировал вашу утилиту командой More c выдачей строки из текстового файла. Вот два варианта, если устроит выдача результата в кавычках.
Код:

@Echo Off
cls
        Echo Вариант 1
        For /f "usebackq tokens=1,2,3,4,5 delims=}" %%i In (`More яяяю.txt`) Do (
                Echo "%%i"
                Echo "%%j"
                Echo "%%k"
                Echo "%%l"
                Echo "%%m"
        )

        Echo. &Echo Вариант 2
        For /f "usebackq tokens=1,2,3,4,5 delims=}" %%i In (`More яяяю.txt`) Do (
                Set "@@a1="%%i""
                Set "@@a2="%%j""
                Set "@@a3="%%k""
                Set "@@a4="%%l""
                Set "@@a5="%%m""
        )
        Echo %@@a1%
        Echo %@@a2%
        Echo %@@a3%
        Echo %@@a4%
        Echo %@@a5%
pause
Exit /B


ioSIS 28-05-2022 12:44 2985858

Цитата:

Цитата megaloman
Я сымитировал вашу утилиту командой More c выдачей строки из текстового файла. Вот два варианта, если устроит выдача результата в кавычках.
Код: »

Не устроит)
Плюс, у Вас можно вывести только 5 строк, а их в выводе команды может быть сколько угодно.

Воспользовался советом DJ Mogarych на счет \n в выводе MediaInfo.exe. Но это частный случай с этой утилитой.

Вопрос в общем остается открытым:
Как с помощью CMD разбить строку на подстроки по разделителю, если она содержит спец-символы?

Fors1k 28-05-2022 13:07 2985859

Цитата:

Цитата ioSIS
Вопрос в общем остается открытым»

Вам же уже дали готовый код с решением. А cmd устаревший язык, который не используется уже более 20 лет. Не просто так его разработку забросили в 2000г. Microsoft выпустили вместо него PowerShell.
Если так будет понятнее, то вы спрашиваете "как на черно-белом ламповом тв запустить приложение кинопоиск и включить мстителей в 4к", а вам отвечают, что таких тв уже нет ни у кого, и вам нужен смарт-тв с приложениями и 4к разрешением.

ioSIS 28-05-2022 22:49 2985885

Цитата:

Цитата Fors1k
Вам же уже дали готовый код с решением. А cmd устаревший язык, который не используется уже более 20 лет. Не просто так его разработку забросили в 2000г. Microsoft выпустили вместо него PowerShell. »

Похоже, Вы правы, цепляться за CMD при наличии более современных и удобных средств - вряд ли разумно.

Вот еще подсказали способ разбивать строку со спецсимволами с помощью WSH. Может пригодиться кому. Код сохранить в .bat и запускать как обычно:

Код:

@set @x=0 /*
@echo off
chcp 65001 >nul
set attr="%%StreamKindPos%%|%%Language/String%%|%%Title%%}}}"
pushd "C:\Program Files\MediaInfo\"
FOR /F "usebackq delims=" %%i IN (`mediainfo.exe --Output^=Audio^;%attr% %1`) DO ( set audio=%%i)
popd
set "audio=%audio:"=\*quotes*\%"
cscript /nologo /e:javascript %0 "%audio%"
goto :EOF
 */
var output=WScript.Arguments(0).replace(/\\\*quotes\*\\/gi,'"').replace(/}}}/gi,'\n').slice(0,-1);
WScript.Echo(output);



Время: 22:28.

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