Regex 带有或(|)和制表符(\t)的egrep搜索无效
有一个文件包含以下内容Regex 带有或(|)和制表符(\t)的egrep搜索无效,regex,grep,Regex,Grep,有一个文件包含以下内容 ➜ ~ cat foo 123 456 1234 1234 123456789 12345678 123456789 12345678 12345678901234567890 12345678901234567890 并且只有第一列是9位(\d{9})是有效的,所以我想grep那些无效的行,首先我尝试了下面的命令,但它不起作用 ➜ ~ cat foo | egrep $'^[0-9]{1,8}\t.*$ | ^[0-9]{10,}\t.
➜ ~ cat foo
123 456
1234 1234
123456789 12345678
123456789 12345678
12345678901234567890 12345678901234567890
并且只有第一列是9位(\d{9}
)是有效的,所以我想grep那些无效的行,首先我尝试了下面的命令,但它不起作用
➜ ~ cat foo | egrep $'^[0-9]{1,8}\t.*$ | ^[0-9]{10,}\t.*$'
没有输出
然后我尝试了下面的命令,这次它起作用了
➜ ~ cat foo | egrep -v $'^[0-9]{9}\t.*$'
123 456
1234 1234
12345678901234567890 12345678901234567890
那么为什么第一个命令不起作用,哪里错了呢?怎么能让它也起作用呢?您的备选选项周围需要括号:
egrep '(^[0-9]{1,8}[[:space:]].*$)|(^[0-9]{10,}[[:space:]].*$)' foo
但实际上,你的第二个表达更有意义。搜索不包含9个数字的行,而不是包含1-8个数字或10个或更多数字的行。另外,grep
可以接受文件名参数;无需使用cat
看起来这就是你想要的:
egrep -v "^[0-9]{9}[[:space:]]" foo
您的备选选项周围需要括号:
egrep '(^[0-9]{1,8}[[:space:]].*$)|(^[0-9]{10,}[[:space:]].*$)' foo
但实际上,你的第二个表达更有意义。搜索不包含9个数字的行,而不是包含1-8个数字或10个或更多数字的行。另外,grep
可以接受文件名参数;无需使用cat
看起来这就是你想要的:
egrep -v "^[0-9]{9}[[:space:]]" foo
谢谢但是使用egrep$(^[0-9]{1,8}\t.$)|(^[0-9]{10,}\t.$)'foo仍然没有输出。请注意表达式中有制表符。如果不想使用我的第二个建议,请不要在
|
周围加空格。刚刚编辑,忘记了grep正则表达式不喜欢制表符的\t
。谢谢,您的第二个建议很有效。但是,如果在某些情况下,我必须将空格与|
组合在一起,如何解决它?您是在寻找文本|
?如果你是,我误解了这个问题。如果不是的话,我不知道你为什么要在它周围留出空间。谢谢!但是使用egrep$(^[0-9]{1,8}\t.$)|(^[0-9]{10,}\t.$)'foo仍然没有输出。请注意表达式中有制表符。如果不想使用我的第二个建议,请不要在|
周围加空格。刚刚编辑,忘记了grep正则表达式不喜欢制表符的\t
。谢谢,您的第二个建议很有效。但是,如果在某些情况下,我必须将空格与|
组合在一起,如何解决它?您是在寻找文本|
?如果你是,我误解了这个问题。如果不是,我不知道你为什么要在它周围有空间。