Невозможно проанализировать строку (содержащую путь), разделенную разделителем - PullRequest
1 голос
/ 15 июня 2010

У меня проблема с анализом строки, которая состоит только из пути к каталогу.Например,

Моя входная строка Abc\Program Files\sample\

Мой вывод должен быть Abc//Program Files//sample

Скрипт должен работать для входного пути любой длины, т.е. он можетне содержат никакихподкаталогов.(Например, abc \ temp \ sample \ folder \ joe)

Я искал помощи во многих ссылках, но безрезультатно.Похоже, команда FOR извлекает только одну целую строку или строку (когда мы используем ключевое слово 'token' в синтаксисе FOR), но моя проблема в том, что я не знаю длину пути ввода и, следовательно, нет.из токенов.

Моя идея состояла в том, чтобы использовать \ в качестве разделителя, а затем извлекать каждое слово до и после него () и помещать слова в выходной файл вместе с //, пока не достигнем конца строки.

Я попытался реализовать следующее, но это не сработало:

@echo off

FOR /F "delims=\" %%x in (orig.txt) do (
    IF NOT %%x == "" echo.%%x//>output.txt    
)

Файл orig.txt содержит только одну строку, то есть Abc \ Program Files \ sample \

Вывод, который я получаю, содержит только: Abc //

Вышеуказанный вывод также содержит пробелы после 'Abc //'

Мой желаемый вывод должен быть: Abc // program Files // sample //

Может кто-нибудь помочь мне с этим?

С уважением,
Technext

Ответы [ 4 ]

2 голосов
/ 15 июня 2010

Вы пробовали сопоставление с образцом?Я знаю, что в Perl и Java вы можете сделать простую замену, которая находит все "\" и заменяет их на "//"

Пример в Perl:

my $var = "Abc\Program Files\sample\"
$var  =~ tr/\\/\/\//; 

Просто посмотритесопоставление с образцом или регулярное выражение

1 голос
/ 02 ноября 2011

Вы можете использовать простую строковую подстановку:

C:\>set myvariable=Abc\Program Files\sample\    

C:\>echo %myvariable%
Abc\Program Files\sample\

C:\>set myvariable=%myvariable:\=//%

C:\>echo %myvariable%    
Abc//Program Files//sample//
0 голосов
/ 16 июня 2010

Спасибо за ваш вклад, Кира!Я знаю, что это легко в Shell или Perl, но в любом случае, у меня есть решение.

Вот оно:


введите nul> output.txt

FOR /F "usebackq tokens=*" %%x in ("orig.txt") do (
    set LINE=%%x
    call set LINE=%%LINE:\=//%%
    call echo:%%LINE%%
) >>output.txt

Спасибо, хоанг.Я собирался написать, когда увидел твой ответ.

0 голосов
/ 16 июня 2010

Используя цикл и временный файл, для вашего сценария работает следующее:

@echo off > output.txt
FOR /F "tokens=1,* delims=\" %%x in (orig.txt) do ( 
IF NOT %%y=="" echo %%x//%%y>>output.txt
)
:loop
@echo off > temp.txt
set /a stop=1
FOR /F "tokens=1,* delims=\" %%x in (output.txt) do (
IF NOT "%%y"=="" (
echo %%x//%%y>>temp.txt
set /a stop=0
) ELSE (echo %%x>>temp.txt)
)
IF NOT %stop%==1 (
move /Y temp.txt output.txt
) ELSE (goto end)
goto loop
:end
move /Y temp.txt output.txt

С учетом этого ввода

Abc\Program Files\sample\
Another\Example\\\

вы получите следующий вывод:

Abc//Program Files//sample
Another//Example

Довольно уродливо, не так ли? ^^

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...