使用 grep|sed|awk 从标准输入测试正则表达式

使用 grep|sed|awk 从标准输入测试正则表达式

有时,我想测试我的正则表达式是否正确。

如何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

这是否可以在没有太多脚本的情况下实现?

答案1

在 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

答案2

您可以使用-“文件”来搜索,它将使用标准输入作为“干草堆”来搜索匹配的“针”:

$ 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

其中,needle-patterns是一个纯文本文件,每行一个正则表达式。

相关内容