web-dev-qa-db-ja.com

grep | sed | awkを使用してstdinから正規表現をテストする

時々、私がテストしたいのは私の正規表現が正しいです。

Stdinからのregex一致を逆にするにはどうすればよいですか?

F.e.次のように、提供された正規表現で文字列を照合できます。

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

これは、多くのスクリプトなしで何とかして可能ですか?

7
fugitive

検索する "ファイル"として-を使用できます。これにより、標準の入力が "haystack"として使用され、一致する "針"が検索されます。

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

使用する Ctrl-DEOFを送信してストリームを終了します。

ただし、同じことをして、ファイルからパターンのリストを読み取る-fスイッチの標準入力を使用できるとは思いません。ただし、1つのコーパスのテキストに多くのパターンがある場合は、次のことができます。

grep -f needle-patterns haystack.txt

ここで、needle-patternsは、1行に1つの正規表現を含むプレーンテキストファイルです。

5
DopeGhoti

シェルで次の関数を定義します(単に入力するか、~/.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
7
Wildcard