9

我对 grep 命令有一些问题。我的文件夹中有以下两个文件:

测试数据:

fdf
bla(fd_bla_bla) =&
bdf bla

测试2.dat

fd
fd
fij
d
bla(fdf)

fdjk
bla

现在我搜索 bla 后面有括号

grep 'bla(*)' *

但它只是给了我第一个文件的条目......你知道为什么吗?

4

7 回答 7

10

您需要正则表达式来进行匹配。

egrep "bla\(.*\)" *.dat

会给出正确的结果。

于 2013-09-19T09:04:36.793 回答
4

grep 'bla(*)' *将无法正常工作,因为它会查找bla)or bla((((((((),即 0 或 many (bla然后是 single)

做就是了:

grep '\bbla(' *.dat
  • 默认情况下 grep 使用 BRE,因此(在模式中将匹配文字(
  • ( \bword boundary) 将使 grep 匹配foo bla(..)and bla(xx),但不匹配foobla(xxx).
于 2013-09-19T09:13:19.427 回答
4
grep -F "bla(" 

这将告诉 grep 使用特殊字符作为常规(固定)字符串。

于 2017-11-13T19:34:17.233 回答
2

你只需要.*而不是*

在 Regex.*中匹配任何长度为 0 或更长的任意字符串。*shell GLOB 使用它来匹配任意搜索的文本,但grep不使用GLOB.

grep 'bla(.*)' *.dat

或单词边界:

grep '\<bla(.*)' *.dat

或使用 awk:

awk '/bla\(.*\)/{print FILENAME ":" $0}' *.dat
于 2013-09-19T09:16:36.933 回答
2

另一种解决方案是,如果您的字符串是固定字符串并且它包含括号。因此,在 grep -F 的帮助下,您可以修复字符串,并将按原样进行搜索。 cat enb.txt | grep -F '[PHY][I]UE'** cat enb.txt 是我要捕获的文件名。 grep -F '[PHY][I]UE' grep -F 使字符串成为'[PHY][I]UE' 固定的。

试试这个,我希望它会工作

于 2017-01-19T12:38:10.053 回答
1
perl -lne 'print if(/bla\(.*\)/)' your_file
于 2013-09-19T09:16:46.113 回答
1
$ grep "bla(" *

应该管用。( 不需要转义,因为它表示我们不需要它的正则表达式中的分组。

$ cat > test7
fdf
bla(fd_bla_bla) =&
bdf bla


$ cat > test8
fd
fd
fij
d
bla(fdf)

fdjk
bla

$ grep "bla(" *
test7:bla(fd_bla_bla) =&
test8:bla(fdf)
于 2013-09-20T15:46:24.550 回答