我有一个包含以下 4 行的文件。
A;1;abc;<xml/>;
;2;def;<xml
>hello world</xml>;
;3;ghi;<xml/>;
使用批处理文件,我需要合并行,如果该行不以分号 (;) 结尾,则将下一行合并到当前行中。
所以期望的输出应该是
A;1;abc;<xml/>;
;2;def;<xml>hello world</xml>;
;3;ghi;<xml/>;
我对批处理脚本不太熟悉,但尝试使用for /F
但到目前为止还没有运气。
据我了解,逻辑应该是检查每行的最后一个字符,如果不是分号,则将下一行读入当前行。
除此之外,我设法获取了该行的最后一个字符,但我的脚本仅在不包含 ; 的情况下读取该行。 。有任何想法吗?
@echo off
for /f "tokens=*" %%i in (myfile.txt) do (
set var=%%i
echo %%i
if "%var:~-1%"==";" (
echo test
)
)
注意:上面的查询只读取第1行和第3行。
您的代码有很多问题:)
1)正如您所说,您的代码会忽略以;
- 这是由于默认的 FOR /F EOL 选项造成的。但由于“TOKENS=*”,您的代码还会从每行中删除前导空格。您需要将 EOL 和 DELIMS 设置为空。语法很奇怪,但它有效:
for /f delims^=^ eol^= %%i ...
2) 您尝试在括号内的代码块中设置并展开 var。这是行不通的,因为解析该行时会发生扩展,并且会立即解析整个代码块。所以价值%var%
是循环执行之前存在的值。当然不是你想要的。解决方案是使用延迟扩展。类型FOR /?
从命令提示符获取有关延迟扩展的更多信息(大约在帮助列表的一半位置)
3)对于包含的变量内容!
如果在启用延迟扩展的情况下进行扩展,则会被损坏。解决方案是根据循环内的需要打开和关闭延迟扩展。但这会导致复杂化,因为您需要跨 ENDLOCAL 屏障保留增长线的值。我使用 FOR /F 跨屏障传输值。
这是一个应该完成这项工作的完整批处理脚本。它的局限性在于它无法处理大于最大长度 ~8191 字节的行。
此代码已被重写以修复一个重大错误
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)