最大3つのスペースを入力してください(\ sを含む)。

最大3つのスペースを入力してください(\ sを含む)。

次のチュートリアルによると

  1. https://linuxize.com/post/regular-expressions-in-grep/

\s はスペースと一致します。

そして

  1. https://www.guru99.com/linux-regular-expressions.html

いくつかの間隔正規表現は次のとおりです。

表現の説​​明

{n} は前の文字 "n" 番と正確に一致します。

{n,m} は前の文字 'n' 番と一致しますが、m 以下です。

{n、}先行文字が「n」回以上表示される場合にのみ、その文字と一致します。

サンプルファイル

wolf@linux:~$ cat space.txt
0space
1 spaces
2  spaces
3   spaces
4    spaces
wolf@linux:~$ 

最大3つのスペース、少なくとも1つのスペース、最大3つのスペースをgrepしたいと思います。残念ながら、予想通り実際には動作しません。

wolf@linux:~$ cat space.txt | grep -P '\s{1,3}'
1 spaces
2  spaces
3   spaces
4    spaces
wolf@linux:~$ 

wolf@linux:~$ cat space.txt | grep -P '\s{3}'
3   spaces
4    spaces
wolf@linux:~$ 

wolf@linux:~$ cat space.txt | grep -P '\s{3,3}'
3   spaces
4    spaces
wolf@linux:~$ 

wolf@linux:~$ cat space.txt | grep -P '\s{0,3}'
0space
1 spaces
2  spaces
3   spaces
4    spaces
wolf@linux:~$ 

希望の出力

wolf@linux:~$ cat space.txt | grep -P '\s{0,3}' <- need to fix it here
1 spaces
2  spaces
3   spaces
wolf@linux:~$ 

答え1

以下を行う必要があります。

grep -P '\S\s{1,3}\S' infile

\s空白文字と一致します。だけでなくスペース。
\S空白以外の文字と一致

あなたの試みは、試合の前後にスペースを入れないように制限しません。


空白のみをフィルタリングして PCRE を防止するには、次のようにします。

grep '[^ ] \{1,3\}[^ ]' infile

または、先行/末尾の1〜3個のスペースがある行で作業します。

grep '\([^ ]\|^\) \{1,3\}\([^ ]\|$\)' infile

https://regexper.com/で検索

入力データ(cat -e infile):

0space$
1 spaces$
2  spaces$
3   spaces$
4    spaces$
   3spaces$
    4space$
3spaces   $
4spaces    $

出力:

1 spaces$
2  spaces$
3   spaces$
   3spaces$
3spaces   $

答え2

スペースで囲まれていない1〜3個のスペース文字シーケンスを一致させるには、Perlプレビュー演算子を使用できます。

grep -P '(?<!\s)\s{1,3}(?!\s)'

以下と一致します。

         1
1234567890123456789
    a b  c   d    e
     ^ ^^ ^^^ 

標準を使用すると、grep次の効果が得られます。

grep -E '(^|[^[:space:]])[[:space:]]{1,3}([^[:space:]]|$)'

今回は、1~3 個の空白文字とそのあとの空白以外の文字が、両側 (または^タイトルの先頭 ( ) または末尾 ( )) のシーケンスと一致します。$

         1
1234567890123456789
   a b  c   d    e
^^^^ ^^^^

((GNU拡張)を使用すると、以前-oに一致したa bものを報告しないことがわかりますa

それ以外の場合は、-E代替演算子なしでデフォルトの正規表現を取得できますが(一部のgrep実装では\|これを拡張としてサポートしますが)、標準ケースではまだ次のように実行できます。

grep -x '\(.*[^[:space:]]\)\{0,1\}[[:space:]]\{1,3\}\([^[:space:]].*\)\{0,1\}'

今回は正規表現が 1 ~ 3 個の空白と空白でないで終わるオプションの ( \{0,1\}ERE 同等?) 先行部分、その後に空白ではないで始まるオプションの部分を含む全体行と一致します。

         1
1234567890123456789
   a b  c   d    e
^^^^^^^^^^^^^^^^^^

それにもかかわらず、空白で囲まれていない1〜3個の空白シーケンスも含む限り、これは4つ以上の空白シーケンスを含む行を返します。

4つ以上のスペースを含む行を除外したい場合は、次のようにします。

grep -vE '[[:space:]]{4}'

あるいは、まだ1つ以上のスペースが必要な場合、つまり行には1つ以上のスペース文字シーケンスが含まれており、すべて1つ以上のスペースがありますが、3つを超えることはできません。

grep -vE -e '[[:space:]]{4}' -e '^[^[:space:]]*$'

つまり、空白が4つの連続した行と、空白以外の行のみを含む行を除くすべての行が返されます。

または、Perlを再度使用して演算子を確認してください。

grep -P '^(?=.*\s)(?!.*\s{4})'

これは、後ろにランダムな数の文字とスペースが続き、後にランダムな数の文字と4つのスペースがない場合の行の先頭と一致します。

sedorを使用すると、awk同じ呼び出しで肯定的な一致と否定的な一致の両方を実行できますが、次のようにするとよりきれいになります。

awk '/[[:space:]]/ && ! /[[:space:]]{4}/'
sed '/[[:space:]]/!d; /[[:space:]]\{4\}/d'

答え3

反対側から来てください。部分文字列からスペースが3つ以上の行を除外します。

grep -Ev '\s{4,}'

-v一致しない行を選択するには、一致の意味を逆にします。
スペース以外の文字でアンカーを挿入できます。

grep -E '\S\s{1,3}\S'

答え4

$ grep -E '[[:space:]]' < file |
  grep -vE '[[:space:]]{4}'
1 spaces
2  spaces
3   spaces
  • まず、1つ以上の空白文字を含むすべての行をフィルタリングします。
  • ここでは、4つ以上の空白文字を含むすべての行をフィルタリングします。
  • 残りは1〜3個の空白文字で構成される行です。

関連情報