【问题标题】:advanced text searching windows command line utility高级文本搜索 Windows 命令行实用程序
【发布时间】:2016-01-24 17:21:08
【问题描述】:

是否存在用于 Windows 的命令行实用程序,它可以搜索比 FIND 和 FINDSTR 更复杂的文本?无论单词顺序如何,都能找到包含指定关键字的所有文本行?

例如,如果关键字是“Happily Ever After”,它应该找到包含“Ever After Happily”和“如果今天之后发生这种情况,她会很高兴地接受它”的行,而不是“Happyly together”。

【问题讨论】:

  • 所以你说它必须在一行中找到所有三个搜索词。
  • @Squashman 是的,确实。
  • 为每个搜索词提供一个查找命令,并将每个查找的输出通过管道传送到下一个查找。
  • @Squashman 你能写一个例子吗?
  • should match whole words only:findstr可以do this

标签: windows batch-file cmd command


【解决方案1】:
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

仅以上。

这是你需要的吗?

【讨论】:

  • 阅读原始问题下方的所有 cmets。您需要匹配整个单词。
  • @Squashman 我不太清楚你的意思。你的意思是你只想要一行上的单词?此外,您能否在输入中尝试代码并解释问题所在?
  • 不是我。问问题的人。你不明白匹配整个单词是什么意思吗?他们在他们的 cmets 中给出了一个具体的例子。您的代码将不起作用。
  • 不,我不明白他或你匹配整个单词是什么意思。您要删除其他单词或其他内容吗?
  • 例如,假设单词“happily”、“after”和“every”出现在一行中,或者“happily”“ever”“afterwards”——这些会根据你的建议找到,但是可能不符合 OP 的要求。
【解决方案2】:

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

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

这是使用 JREPL 的一种可能的解决方案。我将变量abc 初始化为0,然后在每一行上搜索所需的单词,如果找到,每个单词都将不同的变量设置为1。替换字符串还必须用它自己替换找到的单词。在每一行的末尾,如果 a+b+c &lt;&gt; 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 "\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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多