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

时间:2017-01-25 15:25:32

标签: windows batch-file cmd

我的问题是找到并保存每行的最后一个字。

我有多行。此信息保存在.txt文件中。因此,我需要构建一个CMD脚本,该脚本可以扫描txt文件,找到每行的最后一个单词并将其保存到新的.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.

我尝试了很多选项和方法,但遗憾的是没有运气。

3 个答案:

答案 0 :(得分:2)

试一试。它使用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

答案 1 :(得分:2)

这种纯粹的批处理方法正确处理所有字符,但它的每行字数限制(此版本为26),但可以通过usual tricks增加此限制。

@echo off
setlocal DisableDelayedExpansion

for /F tokens^=1-26^ eol^= %%a in (input.txt) do (
   set "last="
   for %%T in (z y x w v u t s r q p o n m l k j i h g f e d c b a) 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

答案 2 :(得分:1)

如果文件包含引号和毒药字符,

Squashman's answer可能会失败。

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

@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

这两种解决方案的一个好处是,即使在最后一个&#34;单词&#34;之后有空格,它们也能给出正确的结果。如果该行不包含任何&#34;&#34;

,他们就不会打印任何内容