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

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

時々、正規表現が正しいかどうかをテストしたいことがあります。

regexstdin から逆マッチを行うにはどうすればいいですか?

次のように、提供された正規表現を使用して文字列を一致させることができます。

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-patterns1 行につき 1 つの正規表現を含むプレーンテキスト ファイルです。

関連情報