高级文本搜索Windows命令行实用程序

时间:2016-01-24 17:21:08

标签: windows batch-file cmd command

Windows是否存在可以搜索比FIND和FINDSTR更复杂的文本的命令行实用程序?什么东西会找到包含指定关键字的所有文本行,而不管单词的顺序?

例如,如果关键字是"幸福永远"它应该找到包含" Ever After Happily"并且"如果在今天之后发生这种情况,她会高兴地拥抱它,而不是快乐地和#34 ;.

2 个答案:

答案 0 :(得分:2)

type search.txt | findstr /i /r "\<happily\>" | findstr /i /r "\<ever\>" | findstr /i /r "\<after\>"

我使用了测试用例...

search.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

以上。

这是你需要的吗?

答案 1 :(得分:1)

我喜欢Mee's answer,因为它只使用本机命令。但是,它必须为每个要搜索的单词读取一次文件。如果添加大量额外测试,这可能会减慢速度。

您可以使用我的JREPL.BAT hybrid Jscript/batch regex utility,再加上一些用户提供的JScript,并获得一个高效且强大的解决方案,只需通过文本即可生成结果。 JREPL是纯脚本,可​​以在XP以后的任何Windows机器上本机运行。完整文档嵌入在脚本中,可以通过jrepl /?jrepl /??访问分页输出。

这是使用JREPL的一种可能的解决方案。我将变量abc初始化为0,然后在每一行上搜索所需的单词,如果找到,每个单词将不同的变量设置为1。替换字符串还必须用自己替换找到的单词。在每一行的末尾,如果总和为a+b+c <> 3,则禁用该行的打印输出,然后我将所有三个变量重置为0以准备下一行。最后的/F选项指定我正在搜索文件“test.txt”。我使用行继续来使long命令更容易阅读。

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 "\bhappily\b \bever\b \bafter\b"^
           "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