grep搜索指定的模式

时间:2016-06-25 10:37:37

标签: regex shell unix sed grep

我想grep包含符号(非字母数字)的文件中的所有文本,并以数字开头,并且它们之间有空格

grep -i "^[0-9]\|[^a-zA-Z0-9]\| "

我编写了以下grep命令,该命令工作正常,但是我也希望包含那些没有特定限制的文本,例如所有那些小于3且大于15的文本应该是greped 如何在一个命令中包含该限制模式

我尝试使用

{3,15} 

并且几乎无法获得所需的输出

sample input 
aa
9dsa
abcd
abc#$
ab d

Sample output
aa               //because length less than 3
ab d             //because has space in between
9dsa             // because starts with a number
abc#$            //because has special symbols in it

2 个答案:

答案 0 :(得分:2)

为了清晰起见,简单,健壮,可移植性等,只需使用awk而不是grep来搜索非平凡的条件:

$ awk 'length()<3 || length()>15 || /[^[:alnum:]]/ || /[[:space:]]/ || /^[0-9]/' file
aa
9dsa
abc#$
ab d

我的意思是认真,这可能不会更清晰/更简单,并且它可以在任何POSIX awk中工作,如果/当你的需求发生变化时,改变是微不足道的。

答案 1 :(得分:1)

下面的表达式可以帮助您找到所需的行。我假设您将使用grep -E,因此更改将正常工作

^[[:digit:]]|[@#$%^&*()]|^.{0,3}$|^.{15,}$

以下是正则表达式的解释

^[[:digit:]]    - Match a line that starts with a number
[@#$%^&*()]     - Match a line containing the specified symbols.
                  Alternatively you can use [^[:alnum:]], if you want 
                  the symbol to match any non alpha numeric character. 
                  Beware that a space, underscore, tab, quote, etc are all 
                  examples of non alpha numeric characters
^.{0,3}$        - Match a line containing less than 3 characters
^.{15,}$        - Match a line containing more than 15 characters