時々、正規表現が正しいかどうかをテストしたいことがあります。
regex
stdin から逆マッチを行うにはどうすればいいですか?
次のように、提供された正規表現を使用して文字列を一致させることができます。
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
シェルで次の関数を定義します (単に入力するか、 に配置することもできます~/.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- を使用します。DEOF
ただし、ファイルからパターンのリストを読み込むスイッチに標準入力を使用するために同じことができるとは思いません-f
。ただし、1 つのコーパスにテキスト化するパターンが多数ある場合は、次の操作を実行できます。
grep -f needle-patterns haystack.txt
ここで、はneedle-patterns
1 行につき 1 つの正規表現を含むプレーンテキスト ファイルです。