使用Windows批处理程序在文件中查找并复制字符串

3
我称要搜索的文件为input.txt,要查找的字符串为mystringinput.txt的示例内容(真实的input.txt)
randomstring1<>"\/=:
randomstring2<ORIGINAL>mystring</ORIGINAL>randomstring3
  • mystring被字符串<ORIGINAL></ORIGINAL>包围,需要搜索它们
  • 两个ORIGINAL标签之间的字符串应该复制到剪贴板中(使用| clip)
  • mystring和标签只出现一次。但是它们没有固定的位置
  • 所有字符串都可能包含特殊字符(<, >, ", \, /, =, :)

我阅读了很多其他的SO问题,但老实说:FOR循环和SET命令语法对我来说太笨拙了。我想我的最佳选择将是FINDSTR命令。但也许也可以通过一些正则表达式的帮助来实现。

不想使用VBscript、Powershell、SED、FART、AWK、grep或任何其他额外的工具。

请友善地解释难点,如果您发布一个解决方案。
我想理解它,也许对其他人有帮助。

在我放弃之前,最后一次尝试是这个test.cmd

@echo off
set "x=randomstring1<>"\/=:randomstring2<ORIGINAL>mystring</ORIGINAL>randomstring3"
set "x=%x:*<ORIGINAL>=%"
set "x=%x:</ORIGINAL>*=%"
set  x=%x:~2%
echo %x%
pause

“FOR循环和SET命令语法对我来说太笨拙了” - 不幸的是,Windows批处理脚本的许多功能看起来都很笨拙。即使你习惯了它们,有些功能仍然看起来很笨拙,特别是如果你知道其他脚本工具或语言中可能更容易/更清晰的解决方案。无论如何,对于Windows批处理脚本中逐行处理文本文件的两个最基本的本地设备——FOR / F循环和SET / P赋值,您最好要习惯它们。 :) 而且,谁知道呢,它们最终可能会变得越来越好用。 :) - Andriy M
1个回答

2
@echo off
rem Let findstr to find the LINE you want (only once):
for /F "delims=" %%a in ('findstr "<ORIGINAL>" input.txt') do set "line=%%a"
ECHO LINE: "%line%"
rem Change left delimiter by {
set "line=%line:<ORIGINAL>={%"
rem Change right delimiter by }
set "line=%line:</ORIGINAL>=}%"
ECHO STRING DELIMITED: "%LINE%"
rem Get second token delimited by { and }
for /F "tokens=2 delims={}" %%a in ("%line%") do set string=%%a
ECHO STRING: "%STRING%"
rem Copy string to clipboard
REM echo %string%| clip

输出:

LINE: "randomstring2<ORIGINAL>mystring</ORIGINAL>randomstring3"
STRING DELIMITED: "randomstring2{mystring}randomstring3"
STRING: "mystring"

作为一个选项,您可以从行的开头删除直到左分隔符:
set "line=%line:*<ORIGINAL>=%"

...并获取您想要的任何分隔符(例如:})分隔的第一个令牌:

for /F "delims=}" %%a in ("%line%") do set string=%%a

for /F "delims=" %%a in ('findstr "mystring" input.txt')。这是在搜索“mystring”,对吗?但是“mystring”是未知的,无法搜索。它被<ORIGINAL>和</ORIGINAL>包围。也许我的描述有误? - nixda
糟糕!我的失误,我有些心不在焉...只需在findstr命令中将"mystring"更改为"<ORIGINAL>";我已经在上面的程序中完成了这个操作并进行了测试:输出结果相同;-) - Aacini
它是区分大小写的 =D 非常感谢。 (ORIGINAL > original) - nixda
我怀疑是否有什么愚蠢的技巧可以让FINDSTR在变量内搜索字符串,而不是在文件内搜索? - nixda
@nixda:只需将变量值作为过滤器传递给 FINDSTR:echo %variable% | findstr ...,但在这种情况下,结果将只是相同的值或者什么都没有,这取决于搜索字符串是否在变量中。 - Aacini
第一次尝试:for /F "delims=" %%a in ('findstr "<original>" "%variable%" ') do set "line=%%a" 第二次尝试:for /F "delims=" %%a in ('echo %variable% | findstr "<original>" ') do set "line=%%a" <- 你是指这种方式吗? - nixda

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