2016-01-24 56 views
0

是否存在Windows命令行實用程序,可以搜索比FIND和FINDSTR更復雜的文本?無論文字順序如何,都能找到包含指定關鍵字的所有文本行?高級文本搜索窗口命令行實用程序

例如,如果關鍵字是「Happily Ever After」,它應該找到包含「永遠快樂」和「如果今天發生後,她會高興地擁抱它」的行,但不是「快樂地在一起」。

+0

所以你說它必須在一行中找到所有三個搜索項。 – Squashman

+0

@Squashman確實如此。 – zcalebz

+0

爲每個搜索項找到命令,並將每個查找的輸出傳遞給下一個查找。 – Squashman

回答

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

請閱讀原始問題下面的所有評論。你需要匹配整個單詞。 – Squashman

+0

@Squashman我不太清楚你的意思。你的意思是你只想要一行字?此外,你可以嘗試輸入代碼並解釋什麼是錯誤的? – Mee

+0

不是我。提問的人。你不明白匹配整個單詞意味着什麼嗎?他們在評論中給出了具體的例子。你的代碼不會工作。 – Squashman

1

我喜歡Mee's answer,因爲它只使用本機命令。但是,它必須爲每個要搜索的單詞讀取一次文件。如果添加大量附加測試,這可能會減慢速度。

您可以使用我的JREPL.BAT hybrid Jscript/batch regex utility,加上一些用戶提供的JScript,並獲得一個高效穩健的解決方案,通過文本單次傳遞結果。 JREPL是純粹的腳本,可以在任何Windows XP機器上運行。腳本中嵌入了完整的文檔,可通過jrepl /?jrepl /??訪問頁面輸出。

以下是使用JREPL的一種可能的解決方案。我將變量a,bc初始化爲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 "\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