Является ли вызов FOR с "tokens = *" или "delims =" функционально эквивалентным? - PullRequest
0 голосов
/ 24 июня 2018

Рассмотрим следующие два цикла:

for /f "tokens=*" %%a in ('dir /b %TEMP%') do (
   echo %%a
)

и

for /f "delims=" %%a in ('dir /b %TEMP%') do (
   echo %%a
)

Если желаемый результат заключается в предоставлении переменной %%a содержимого всей оцениваемой строки, являются ли параметры tokens=* и delims= функционально эквивалентными?

Есть ли ситуации, когда я мог бы получить другой вывод с тем или иным при заданном вводе?

Я хотел бы знать, должны ли эти два варианта всегда использоваться в комбинации, чтобы гарантировать охват всех возможных случаев, или если указание обоих вариантов является излишним.

1 Ответ

0 голосов
/ 24 июня 2018

Да, tokens=* и delims= различны:

  • delims= возвращает всю строку неотредактированной;
  • tokens=* возвращает строку с удаленными начальными разделителями ( SPACE и TAB по умолчанию);
  • tokens=* delims= ведет себя точно так же, как delims=;

Обратите внимание, что пустые строки всегда пропускаются. Также строки, начинающиеся с ;, игнорируются, так как этот символ является значением по умолчанию eol.

Если указано tokens=* и строка содержит только разделители, цикл for /F повторяется и мета-переменная возвращает пустую строку. Как только указан любой номер токена (например, tokens=3, tokens=1,3, tokens=2-3, tokens=2* и т. Д.), Пропускаются только строки с разделителями.
Однако строка, содержащая один или несколько разделителей плюс символ eol плюс произвольная строка, игнорируется, даже если указана tokens=*.


Для доказательства я провел несколько тестов, используя следующий текстовый файл sample.txt (обратите внимание, что строка 2 nd пуста, строка 4 th содержит четыре ПРОБЕЛЫ ; нажмите кнопку edit под этим ответом и просмотрите необработанный текст):

text_without_delimiters

text with delimiters

  text with leading and trailing delimiters  
; comment text
  ; comment text with leading delimiters
text plus ; comment text

И вот что я сделал на консоли вместе с соответствующими строками возврата:

>>> for /F %I in (sample.txt) do @echo "%I"
"text_without_delimiters"
"text"
"text"
"text"

>>> for /F "tokens=*" %I in (sample.txt) do @echo "%I"
"text_without_delimiters"
"text with delimiters"
""
"text with leading and trailing delimiters  "
"text plus ; comment text"

>>> for /F "delims=" %I in (sample.txt) do @echo "%I"
"text_without_delimiters"
"text with delimiters"
"    "
"  text with leading and trailing delimiters  "
"  ; comment text with leading delimiters"
"text plus ; comment text"

>>> for /F "tokens=* delims=" %I in (sample.txt) do @echo "%I"
"text_without_delimiters"
"text with delimiters"
"    "
"  text with leading and trailing delimiters  "
"  ; comment text with leading delimiters"
"text plus ; comment text"

>>> for /F "tokens=3" %I in (sample.txt) do @echo "%I"
"delimiters"
"leading"
";"

>>> for /F "tokens=1,3" %I in (sample.txt) do @echo "%I"    "%J"
"text_without_delimiters"    ""
"text"    "delimiters"
"text"    "leading"
"text"    ";"

>>> for /F "tokens=2-3" %I in (sample.txt) do @echo "%I"    "%J"
"with"    "delimiters"
"with"    "leading"
"plus"    ";"

>>> for /F "tokens=2*" %I in (sample.txt) do @echo "%I"    "%J"
"with"    "delimiters"
"with"    "leading and trailing delimiters  "
"plus"    "; comment text"

Таким образом, единственным действительно странным и неожиданным выводом является строка "" с одним параметром tokens=*.

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