CMD脚本:读取并保存每行的最后一个字(多行)

我的问题是关于查找和保存每行的最后一个字。

我有多条线。 这些信息保存在一个.txt文件中。 因此,我需要build立一个CMD脚本,它可以扫描整个txt文件,find每一行的最后一个单词并保存到一个新的.txt文档中。 这里的分隔符将成为空间

例如:

 It's a very small window<34>. The small birds were singing softly. There are three small rooms up stairs (4) The house has but two small second story bedrooms. 

我希望看到保存在单独的txt文档中的结果需要如下所示:

 window<34>. softly. (4) bedrooms. 

我已经尝试了很多select和方法,但不幸的是没有运气。

试试这个。 它用SET命令使用了一个简洁的技巧。 您可以在dostips.com上获得这种技术的高级概述。

 @echo off & setlocal enableextensions disabledelayedexpansion FOR /F "delims=" %%G IN (test.txt) DO CALL :lasttoken "%%~G" GOTO :EOF :lasttoken set "x=%~1" set "x1=%x: =" & set "x2=%" setlocal enabledelayedexpansion >>newtest.txt echo !x2! endlocal goto :eof 

这种纯粹的批处理方法正确地处理所有的字符,但是每行的字数有限(这个版本是26),尽管这样的限制可以通过一般的技巧来增加。

 @echo off setlocal DisableDelayedExpansion for /F tokens^=1-26^ eol^= %%a in (input.txt) do ( set "last=" for %%T in (zyxwvutsrqponmlkjihgf edcba) do ( if not defined last call :sub %%T ) ) goto :EOF :sub token for %%? in (-) do ( set "last=%%%1" if defined last echo %%%1 ) exit /B 

如果文件包含引号和有毒字符, Squashman的答案可能会失败。

无论内容如何,​​都可以编写一个可靠地完成工作的纯批处理解决方案。

 @echo off setlocal disableDelayedExpansion >"output.txt" ( for /f usebackq^ delims^=^ eol^= %%A in ("input.txt") do ( set "s=%%A" setlocal enableDelayedExpansion set "s=!s:@=@a!" set "s=!s:\=@b!" set "s=!s:/=@f!" set "s=!s:.=@d!" set "s=!s: =.!" for /f "delims=" %%A in (".!s!") do ( endlocal set "s=%%~xA" setlocal enableDelayedExpansion if defined s ( set "s=!s:.= !" set "s=!s:@d=.!" set "s=!s:@f=/!" set "s=!s:@b=\!" set "s=!s:@a=@!" echo(!s:~1! ) endlocal ) ) ) 

但我永远不会使用纯粹的批处理解决方案。 相反,我会使用JREPL.BAT – 一个混合批处理/ Jscript实用程序,有效地进行正则表达式搜索和替换文本。 这不是纯粹的批处理,而是纯粹的脚本,从XP以后的任何Windows机器上本机运行 – 不需要第三方的.exe文件。

 call jrepl "(\S+)\s*$" "$txt=$1" /jmatchq /f input.txt /o output.txt 

这两个解决方案的一个好处是,即使在最后一个“单词”之后有空格,它们也会给出正确的结果。 如果行不包含任何“单词”,他们不会打印任何内容