時々、私がテストしたいのは私の正規表現が正しいです。
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
これは、多くのスクリプトなしで何とかして可能ですか?
検索する "ファイル"として-
を使用できます。これにより、標準の入力が "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つの正規表現を含むプレーンテキストファイルです。
シェルで次の関数を定義します(単に入力するか、~/.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