从findstr命令输出中替换字符串

3

我成功地使用findstr在一个长列表的文件中搜索字符串。我将findstr的输出重定向到不同的文本文件,但是我需要摆脱输出行的起始部分,该部分也包含源文件的引用。以下是示例基础。

echo testtest > testing.txt
findstr 'test' *.txt > output.txt //output is 'testing.txt:testtest'

我需要做类似于这样的事情。
echo testtest > testing.txt
findstr 'test' *.txt | *something* > output.txt //output is 'testtest'

注意事项:
我只能使用标准CMD命令,不能在目标计算机上安装新软件。

4个回答

4

类似这样的代码应该可以正常工作:

@echo off
for /f "delims=: tokens=1*" %%i in ('findstr "test" *.txt') do (
  echo %%j
) >> output.txt

请注意,所有的输入文件必须有一个换行符,否则当前文件的第一个匹配项可能会被附加到上一个文件的最后一个匹配项,如果该匹配项位于最后一行:

testtestFOO.TXT:something test other

+1,关于CR / LF问题的处理得很好 :-) 我在我的回答中有解决方案。 - dbenham
但是CRLF真的会有问题吗?您正在使用echo打印结果,它不是总是附加CRLF吗? - Andriy M
1
@AndriyM - 当然没问题!问题出现在ECHO之前很久。如果文件的最后一行匹配并且缺少CR/LF,FINDSTR会将多个文件的行连接起来。当FINDSTR打印匹配行时,它会打印该行的二进制图像,包括行终止符。如果匹配行缺少CR/LF,则FINDSTR不会附加自己的CR/LF。 - dbenham
@dbenham:啊,想要在没有验证事情的情况下显得聪明的诱惑!感谢您纠正我。 - Andriy M

4
这里有一个解决Ansgar Wiechers在他的回答中指出的CR/LF问题的解决方案。
我使用一个FOR循环来迭代所有文件,并在每个单独的文件上运行FINDSTR。我在每个文件之间输出一个空行。最后,我使用一个更多的FINDSTR来删除任何不必要的空行。
@echo off
>"output.txt" (
  for %%F in (*.txt) do (
    findstr "test" "%%F"
    (echo()
  )
)
findstr . "output.txt" >"output.txt.new"
move /y "output.txt.new" "output.txt" >nul
type output.txt

这个可以工作,但在我的情况下,我确定最后一行不会有匹配项,而且我更喜欢一行程序。无论如何,非常感谢(加上1)。 - Gabber

0

你应该使用PowerShell(powershell.exe)来开发所需的脚本。 通过命令行可用的文档非常详尽:

PS > help about

如果您需要更多信息:PowerShell 有语言参考手册吗?


谢谢老兄,但我真的需要CMD。最终的PowerShell脚本将是什么样子? - Gabber

-1
在Linux系统中,您可以像下面的命令一样使用awk
cat output.txt | awk 'match($0,":"){print substr($0,RSTART+1)}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接