根据以下教程
S匹配一个空间。
和
一些区间正则表达式是:表达式描述{n}匹配前面出现的字符'n‘次数,m}与出现'n’次数的前一个字符匹配,但不超过m {n,}只在出现'n‘次或更多次时才匹配前面的字符。
样本文件
wolf@linux:~$ cat space.txt
0space
1 spaces
2 spaces
3 spaces
4 spaces
wolf@linux:~$ 我只想要grep最多3个空间,最少1个空间,最大3个空间,不幸的是,它并不真的像预期的那样工作。
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:~$ 发布于 2020-10-09 05:25:32
你需要:
grep -P '\S\s{1,3}\S' infile\s匹配空格字符,而不仅仅是空格。\S匹配非空格字符。
在您的尝试中,您没有限制在比赛之前&之后,您的比赛不应该是一个空格。
若要仅在空间上进行筛选并避免使用PCRE,可以执行以下操作:
grep '[^ ] \{1,3\}[^ ]' infile或在有1~3个空格的线上工作:
grep '\([^ ]\|^\) \{1,3\}\([^ ]\|$\)' infile
输入数据(cat -e infile):
0space$
1 spaces$
2 spaces$
3 spaces$
4 spaces$
3spaces$
4space$
3spaces $
4spaces $产出:
1 spaces$
2 spaces$
3 spaces$
3spaces$
3spaces $发布于 2020-10-09 07:00:40
如果您想要匹配一个由1到3个空白字符组成的序列,而这些空格字符不被空格包围,那么您可以在这里使用Perl查找操作符:
grep -P '(?它与以下内容相匹配:
1
1234567890123456789
a b c d e
^ ^^ ^^^ 使用标准grep,您可以通过以下方法实现相同的效果:
grep -E '(^|[^[:space:]])[[:space:]]{1,3}([^[:space:]]|$)'这一次,我们将匹配1到3个空格字符的序列和两边的非空白字符(或主题的开始(^)或结束($) )。
1
1234567890123456789
a b c d e
^^^^ ^^^^(使用-o (一个GNU扩展),您会发现它没有报告a b,因为a之前已经匹配;在搜索更多匹配时,它将从上次匹配之后的下一个字符开始)。
如果没有-E,您将得到没有交替运算符的基本regexp(尽管有些grep实现支持将\|作为扩展),但标准而言,您仍然可以这样做:
grep -x '\(.*[^[:space:]]\)\{0,1\}[[:space:]]\{1,3\}\([^[:space:]].*\)\{0,1\}'这一次,regexp匹配整行,包括1到3个空格和一个可选的(\{0,1\},相当于ERE ?),它的前导部分以一个非空格结尾,后面是一个以非空格开头的可选部分。
1
1234567890123456789
a b c d e
^^^^^^^^^^^^^^^^^^在任何情况下,只要它们还包含1到3个没有被空格包围的空白序列,这些代码仍然会返回包含4个或更多空格序列的行。
如果重点是排除包含4个或更多白空间序列的行,则只需:
grep -vE '[[:space:]]{4}'或者,如果您仍然需要至少一个空格,或者换句话说,行包含一个或多个空白字符序列,所有这些字符都至少有一个空格,但不超过3个:
grep -vE -e '[[:space:]]{4}' -e '^[^[:space:]]*即返回所有行,但包含4个空格序列的行和完全由非空白空间组成的行除外。或者再看一遍Perl的四面八方操作符:grep -P '^(?=.*\s)(?!.*\s{4})'这与行的开头相匹配,条件是它后面跟着任意数量的字符和空格,并且不后面跟着任意数量的字符和4个空格序列。尽管在sed或awk中,您可以在相同的调用中进行正反匹配,但这样做更容易读懂:awk '/[[:space:]]/ && ! /[[:space:]]{4}/'sed '/[[:space:]]/!d; /[[:space:]]\{4\}/d'即返回所有行,但包含4个空格序列的行和完全由非空白空间组成的行除外。
或者再看一遍Perl的四面八方操作符:
A19
这与行的开头相匹配,条件是它后面跟着任意数量的字符和空格,并且不后面跟着任意数量的字符和4个空格序列。
尽管在D20或D21中,您可以在相同的调用中进行正反匹配,但这样做更容易读懂:
A22A23
发布于 2020-10-09 06:02:48
你可以从相反的地方走出来。排除子字符串中超过3个空格的行。
grep -Ev '\s{4,}'-v反演匹配感,选择非匹配线.可以将锚插入为非空白字符。
grep -E '\S\s{1,3}\S'https://unix.stackexchange.com/questions/613657
复制相似问题