我对 grep 命令有一些问题。我的文件夹中有以下两个文件:
测试数据:
fdf
bla(fd_bla_bla) =&
bdf bla
测试2.dat
fd
fd
fij
d
bla(fdf)
fdjk
bla
现在我搜索 bla 后面有括号
grep 'bla(*)' *
但它只是给了我第一个文件的条目......你知道为什么吗?
您需要正则表达式来进行匹配。
egrep "bla\(.*\)" *.dat
会给出正确的结果。
您grep 'bla(*)' *
将无法正常工作,因为它会查找bla)
or bla(((((((()
,即 0 或 many (
,bla
然后是 single)
做就是了:
grep '\bbla(' *.dat
(
在模式中将匹配文字(
\b
word boundary) 将使 grep 匹配foo bla(..)
and bla(xx)
,但不匹配foobla(xxx)
.grep -F "bla("
这将告诉 grep 使用特殊字符作为常规(固定)字符串。
你只需要.*
而不是*
在 Regex.*
中匹配任何长度为 0 或更长的任意字符串。*
shell GLOB 使用它来匹配任意搜索的文本,但grep
不使用GLOB
.
grep 'bla(.*)' *.dat
或单词边界:
grep '\<bla(.*)' *.dat
或使用 awk:
awk '/bla\(.*\)/{print FILENAME ":" $0}' *.dat
另一种解决方案是,如果您的字符串是固定字符串并且它包含括号。因此,在 grep -F 的帮助下,您可以修复字符串,并将按原样进行搜索。
cat enb.txt | grep -F '[PHY][I]UE'
** cat enb.txt 是我要捕获的文件名。
grep -F '[PHY][I]UE'
grep -F 使字符串成为'[PHY][I]UE'
固定的。
试试这个,我希望它会工作
perl -lne 'print if(/bla\(.*\)/)' your_file
$ 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)