【问题标题】:How to disable both `eol` and `delims` options of `for /F`?如何禁用“for /F”的“eol”和“delims”选项?
【发布时间】:2015-08-24 22:20:31
【问题描述】:

带有/F 开关的for 命令用于解析文本字符串行(文字字符串、从文本文件中读取或从命令行输出中检索)并将每行解析为一个或多个标记。

我怎样才能得到一行文本,而不替换任何字符或忽略任何行?

我知道for /F "delims=" %L in (*) do echo."%L" 返回未编辑的每个已解析(非空)行。但是,由于eol 选项默认为;,因此以该字符开头的每一行都将被忽略。
如果我使用for /F "tokens=* eol=" %L in (*) do echo."%L"我禁用eol 选项 [编辑:这个说法不正确,"eol=" 不会禁用eol选项,但它将" 定义为eol 字符!],但delims 选项默认为空格和制表符,因此所有前导空格和/或制表符都会被删除。
(在批处理文件中使用%%L* 代表此处任何有效的文本字符串源。)

换句话说,我的问题是:有没有办法指定 no delims and no eol 字符? p>

我尝试指定两个选项字符串 ("eol=" "delims="),但这样会导致语法错误。选项字符串"eol=delims="也是如此。

注意:这个问题在标记化时不会持续存在,也就是说,当设置了delims 选项时,因为它似乎应用了比eol 更高的优先级(奇怪但幸运的是),因此您可以通过将delims 字符也指定为eol 来“隐藏”delims 后面的eol

【问题讨论】:

    标签: batch-file for-loop cmd


    【解决方案1】:

    1) 你将永远无法强制 bat 不使用ignore empty / delimiter-only 行。这可以通过管道到findstr /R /N "^" 命令并使用"tokens=1* delims=:" 之类的选项来解决(排序)并仅获得第二个令牌

    2) 要同时停用eol and delim,您可以使用以下语法:

    For /f tokens^=*^ delims^=^ eol^= %%a in (file.txt) do echo.%%a
    

    虽然空行仍然会被忽略。

    【讨论】:

    • 1) 是的,我知道会跳过空行;解决方法 usinf findstr 是一个好主意,尽管当行以 : 开头时它会失败; 2)非常感谢这种语法,我以前从未见过;这是否将空间定义为分隔符?翻译成标准引用版本,当我正确理解时,它会显示为"tokens=* delims= eol=",对吧?
    • ad 2) 我刚刚发现"[...] eol="" 定义为行尾字符。 (这有多愚蠢??);因此,再次感谢您对未引用版本的提示!我还发现 delims 只有在您想将空格定义为分隔符时才必须是最后一个选项;所以在这种情况下,当你想要它而没有eol时,唯一的机会就是提供eol^=^<new-line><new-line>^<space>delims^=^<space>;这是正确的,还是有更简单(更清晰)的变体?
    • tokens^=*^ 没有害处,但也没有任何用途。您只需要for /f delims^= eol^= %%a in ...
    • @aschipfl 1) 使用findstr /n,您可以构建bullet proof loop,因为每行都以数字开头,您不会遇到任何问题 2) 您不需要换行版本, delims^=^ ... 就够了。
    • 谢谢,@jeb! 1) 我的意思是findstr /Ndelims=: 为领先:s 失败,但我没有想到var:*:=: 扩展; 2) no eoldelims=<space> 需要换行版本,对吗?
    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2021-07-30
    相关资源
    最近更新 更多