是否有适用于Windows的命令行实用程序可以搜索比FIND和FINDSTR更复杂的文本?无论单词顺序如何,都会找到包含指定关键字的所有文本行?
例如,如果关键字是"从此幸福",它应该找到包含"从此幸福"和"如果今天之后发生,她会愉快地拥抱它"的行,而不是"幸福地在一起"。
type search.txt | findstr /i /r "<happily>" | findstr /i /r "<ever>" | findstr /i /r "<after>"
我使用了测试用例...
搜索.txt:
Happily Ever After
Happily Ever After blah
blah Happily Ever After
Happily Ever blah After
If ever that happens after today, she will happily embrace it
happily together
happily
ever
after
happily ever
ever after
after happily
every happily afterwards
这给出了输出:
Happily Ever After
Happily Ever After blah
blah Happily Ever After
Happily Ever blah After
If ever that happens after today, she will happily embrace it
仅以上。
这是你需要的吗?
我的答案,因为它只使用本机命令。但是,它必须读取文件一次才能搜索每个单词。如果添加大量其他测试,这可能会减慢速度。
您可以使用我的 JREPL.BAT 混合 Jscript/batch 正则表达式实用程序,再加上一些用户提供的 JScript,并获得一个高效而强大的解决方案,只需一次通过文本即可生成结果。JREPL是纯脚本,从XP开始在任何Windows机器上本机运行。完整的文档嵌入在脚本中,可以通过jrepl /?
或分页输出jrepl /??
访问。
这是使用 JREPL 的一种可能的解决方案。我将变量初始化a
、b
和c
为 0,然后在每一行上搜索所需的单词,如果找到,每个单词将不同的变量设置为 1。替换字符串还必须将找到的单词替换为自身。在每行的末尾,如果总和为 a+b+c <> 3
,我禁用该行的打印输出,然后将所有三个变量重置为 0 以准备下一行。末尾的/F
选项指定我正在搜索文件"test.txt"。我使用行延续使长命令更易于阅读。
call jrepl "b(?:(happily)|(ever)|(after))b"^
"if ($1) a=1; else if ($2) b=1; else c=1; $0"^
/jbeg "var a=0,b=0,c=0"^
/jendln "if (a+b+c!=3) $txt=false; a=b=c=0"^
/j /i /f test.txt
下面是另一个使用相同的基本逻辑的解决方案,除了我使用/T 选项稍微简化代码。/T 选项类似于 Oracle Translate() 函数、unix tr 命令或 sed y 命令。
call jrepl "bhappilyb beverb bafterb"^
"a=1;$0 b=1;$0 c=1;$0"^
/jbeg "var a=0,b=0,c=0"^
/jendln "if (a+b+c!=3) $txt=false; a=b=c=0"^
/j /i /t " " /f test.txt