首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有S的最多3个空间的grep

问带有S的最多3个空间的grep
EN

Unix & Linux用户
提问于 2020-10-09 04:58:30
回答 3查看 6.3K关注 0票数 5

根据以下教程

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

S匹配一个空间。

和

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

一些区间正则表达式是:表达式描述{n}匹配前面出现的字符'n‘次数,m}与出现'n’次数的前一个字符匹配,但不超过m {n,}只在出现'n‘次或更多次时才匹配前面的字符。

样本文件

代码语言:javascript
复制
wolf@linux:~$ cat space.txt
0space
1 spaces
2  spaces
3   spaces
4    spaces
wolf@linux:~$ 

我只想要grep最多3个空间,最少1个空间,最大3个空间,不幸的是,它并不真的像预期的那样工作。

代码语言:javascript
复制
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:~$ 

期望输出

代码语言:javascript
复制
wolf@linux:~$ cat space.txt | grep -P '\s{0,3}' <- need to fix it here
1 spaces
2  spaces
3   spaces
wolf@linux:~$ 
EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2020-10-09 05:25:32

你需要:

代码语言:javascript
复制
grep -P '\S\s{1,3}\S' infile

\s匹配空格字符,而不仅仅是空格。\S匹配非空格字符。

在您的尝试中,您没有限制在比赛之前&之后,您的比赛不应该是一个空格。

若要仅在空间上进行筛选并避免使用PCRE,可以执行以下操作:

代码语言:javascript
复制
grep '[^ ] \{1,3\}[^ ]' infile

或在有1~3个空格的线上工作:

代码语言:javascript
复制
grep '\([^ ]\|^\) \{1,3\}\([^ ]\|$\)' infile

输入数据(cat -e infile):

代码语言:javascript
复制
0space$
1 spaces$
2  spaces$
3   spaces$
4    spaces$
   3spaces$
    4space$
3spaces   $
4spaces    $

产出:

代码语言:javascript
复制
1 spaces$
2  spaces$
3   spaces$
   3spaces$
3spaces   $
票数 10
EN

Unix & Linux用户

发布于 2020-10-09 07:00:40

如果您想要匹配一个由1到3个空白字符组成的序列,而这些空格字符不被空格包围,那么您可以在这里使用Perl查找操作符:

代码语言:javascript
复制
grep -P '(?

它与以下内容相匹配:

代码语言:javascript
复制
         1
1234567890123456789
    a b  c   d    e
     ^ ^^ ^^^ 

使用标准grep,您可以通过以下方法实现相同的效果:

代码语言:javascript
复制
grep -E '(^|[^[:space:]])[[:space:]]{1,3}([^[:space:]]|$)'

这一次,我们将匹配1到3个空格字符的序列和两边的非空白字符(或主题的开始(^)或结束($) )。

代码语言:javascript
复制
         1
1234567890123456789
   a b  c   d    e
^^^^ ^^^^

(使用-o (一个GNU扩展),您会发现它没有报告a b,因为a之前已经匹配;在搜索更多匹配时,它将从上次匹配之后的下一个字符开始)。

如果没有-E,您将得到没有交替运算符的基本regexp(尽管有些grep实现支持将\|作为扩展),但标准而言,您仍然可以这样做:

代码语言:javascript
复制
grep -x '\(.*[^[:space:]]\)\{0,1\}[[:space:]]\{1,3\}\([^[:space:]].*\)\{0,1\}'

这一次,regexp匹配整行,包括1到3个空格和一个可选的(\{0,1\},相当于ERE ?),它的前导部分以一个非空格结尾,后面是一个以非空格开头的可选部分。

代码语言:javascript
复制
         1
1234567890123456789
   a b  c   d    e
^^^^^^^^^^^^^^^^^^

在任何情况下,只要它们还包含1到3个没有被空格包围的空白序列,这些代码仍然会返回包含4个或更多空格序列的行。

如果重点是排除包含4个或更多白空间序列的行,则只需:

代码语言:javascript
复制
grep -vE '[[:space:]]{4}'

或者,如果您仍然需要至少一个空格,或者换句话说,行包含一个或多个空白字符序列,所有这些字符都至少有一个空格,但不超过3个:

代码语言:javascript
复制
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

票数 10
EN

Unix & Linux用户

发布于 2020-10-09 06:02:48

你可以从相反的地方走出来。排除子字符串中超过3个空格的行。

代码语言:javascript
复制
grep -Ev '\s{4,}'

-v反演匹配感,选择非匹配线.可以将锚插入为非空白字符。

代码语言:javascript
复制
grep -E '\S\s{1,3}\S'
票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/613657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档