是否存在Windows命令行實用程序,可以搜索比FIND和FINDSTR更復雜的文本?無論文字順序如何,都能找到包含指定關鍵字的所有文本行?高級文本搜索窗口命令行實用程序
例如,如果關鍵字是「Happily Ever After」,它應該找到包含「永遠快樂」和「如果今天發生後,她會高興地擁抱它」的行,但不是「快樂地在一起」。
是否存在Windows命令行實用程序,可以搜索比FIND和FINDSTR更復雜的文本?無論文字順序如何,都能找到包含指定關鍵字的所有文本行?高級文本搜索窗口命令行實用程序
例如,如果關鍵字是「Happily Ever After」,它應該找到包含「永遠快樂」和「如果今天發生後,她會高興地擁抱它」的行,但不是「快樂地在一起」。
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
以上版本。
這是你需要的嗎?
我喜歡Mee's answer,因爲它只使用本機命令。但是,它必須爲每個要搜索的單詞讀取一次文件。如果添加大量附加測試,這可能會減慢速度。
您可以使用我的JREPL.BAT hybrid Jscript/batch regex utility,加上一些用戶提供的JScript,並獲得一個高效穩健的解決方案,通過文本單次傳遞結果。 JREPL是純粹的腳本,可以在任何Windows XP機器上運行。腳本中嵌入了完整的文檔,可通過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 "\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
所以你說它必須在一行中找到所有三個搜索項。 – Squashman
@Squashman確實如此。 – zcalebz
爲每個搜索項找到命令,並將每個查找的輸出傳遞給下一個查找。 – Squashman