Пакетное регулярное выражение findstr для поиска элемента из одной строки

Как я могу использовать Microsoft findstr для "grep" элемента из одной строки?

У меня есть строка, которая выглядит примерно так:

<config>test</config><item>some data</item><date>2007-11-02</date><datestart>2007-10-31</datestart><path>d:\test\test\test.txt</path>

Теперь, если я хочу собрать содержимое внутри <date> и </date>, как мне написать это регулярное выражение?

Следует отметить, что мне придется ввести команду findstr в цикл for, чтобы получить дату и сохранить ее в переменной.

пример:

for /f "Tokens=* Delims=" %%i in ('findstr /r /c:"regex" file.txt') do (
    set date=%%i
    set date=!date:-=!
)

Кроме того, я не хочу полагаться на токены, поскольку они могут различаться.


person Niklas J. MacDowall    schedule 09.11.2011    source источник
comment
Думаю эту проблему с findstr не решить. Смотрите мой ответ.   -  person Aacini    schedule 10.11.2011


Ответы (2)


Мы можем использовать трюк, чтобы сделать то, что вы хотите: после чтения строки в переменной замените <date> и </date> символом-разделителем, которого нет в строке (например, $); затем просто используйте for /F "tokens=2 delims=$", чтобы получить содержимое внутри.

set /P the_line=< file.txt
set the_line=!the_line:^<date^>=$!
set the_line=!the_line:^</date^>=$!
for /F "tokens=2 delims=$" %%i in ("!the_line!") do set date=%%i
set date=%date:-=%
person Aacini    schedule 10.11.2011
comment
Спасибо! Я попробую это. Однако возможно ли это: если я хочу заменить дату новой датой: set /p the_line=< file.txt set the_line=!the_line:%date%=%newdate%! echo !the_line! > newfile.txt - person Niklas J. MacDowall; 10.11.2011

Вы можете использовать регулярное выражение "[0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]", которое должно соответствовать вашей дате.

person BON    schedule 09.11.2011
comment
Будет ли он возвращать только эту конкретную строку из этой строки? Проблема, с которой я сталкиваюсь, заключается в том, что вся строка возвращается. - person Niklas J. MacDowall; 09.11.2011
comment
хм, я не уверен насчет findstr. grep -o ‹Pattern› сделает это. - person BON; 09.11.2011