Command-Line

使用 grep|sed|awk 從標準輸入測試正則表達式

  • May 31, 2017

有時,我想測試我的正則表達式是否正確。

如何regex從標準輸入進行反向匹配?

Fe 我可以將字元串與提供的正則表達式匹配,例如:

grep "\(foo\)-bar"
foo
bar
foo-bar
foo-bar #Match found

我想做的恰恰相反,是這樣的:

$ grep "This is one string"
\(This\) #Will send "This" to stdout
This?.*  #Will send full match

這在沒有太多腳本的情況下可能嗎?

您可以使用-作為“文件”進行搜尋,它將使用標準輸入作為“乾草堆”來搜尋匹配的“針”:

$ grep -oE '[aeiou]+' -
This is a test  < input
i               > output
i               > output
a               > output
e               > output
whaaaat?        < input
aaaa            > output

使用Ctrl-D發送EOF和結束流。

不過,我不相信您可以對-f從文件中讀取模式列表的開關使用標準輸入。但是,如果您在一個語料庫上有很多文本模式,您可以:

grep -f needle-patterns haystack.txt

whereneedle-patterns是一個純文字文件,每行一個正則表達式。

在你的 shell 中定義以下函式(你可以輸入它,或者把它放在你的~/.bashrc.

testregex() {
 [ "$#" -eq 1 ] || return 1
 while IFS= read -r line; do
   printf '%s\n' "$1" | grep -Eoe "$line"
 done
}

然後您可以按如下方式測試正則表達式:

$ testregex 'This is a line'
This            <--input
This            <--output
This?.*         <--input
This is a line  <--output
slkdjflksdj     <--input with no output (no match)
s.*             <--input
s is a line     <--output
$               <--I pressed Ctrl-D to end the test

引用自:https://unix.stackexchange.com/questions/368211