我在使用grep命令时遇到了一些问题。我的文件夹中有以下两个文件:
TEST.DAT:
fdf
bla(fd_bla_bla) =&
bdf bla
test2.dat
fd
fd
fij
d
bla(fdf)
fdjk
bla
现在我用
搜索带有括号的blagrep 'bla(*)' *
但它只是给了我第一个文件的条目......你知道为什么吗?
答案 0 :(得分:9)
您需要使用正则表达式来进行匹配。
egrep "bla\(.*\)" *.dat
会给出正确的结果。
答案 1 :(得分:3)
您的grep 'bla(*)' *
无法使用,因为它会在bla)
之后查找bla(((((((()
或(
,即{0}或bla
)
只是这样做:
grep '\bbla(' *.dat
(
将匹配文字(
\b
(字边界)会使grep匹配foo bla(..)
和bla(xx)
,但不会foobla(xxx)
。答案 2 :(得分:2)
grep -F "bla("
这将告诉grep使用特殊字符作为常规(固定)字符串。
答案 3 :(得分:1)
您只需要.*
而不是*
在正则表达式中.*
匹配任意长度为0或更长的字符串。 shell GLOB使用*
来匹配任意搜索的文本,但grep
不使用GLOB
。
grep 'bla(.*)' *.dat
字边界的OR:
grep '\<bla(.*)' *.dat
或使用awk:
awk '/bla\(.*\)/{print FILENAME ":" $0}' *.dat
答案 4 :(得分:1)
另一个解决方案是,如果你的字符串是固定字符串并且它包含括号。所以在grep -F的帮助下你可以修改你的字符串,它将按原样进行搜索。
cat enb.txt | grep -F '[PHY][I]UE'
**
cat enb.txt是我想要捕获的文件名。
grep -F '[PHY][I]UE'
grep -F使字符串'[PHY][I]UE'
固定。
试试这个我希望它能起作用
答案 5 :(得分:0)
perl -lne 'print if(/bla\(.*\)/)' your_file
答案 6 :(得分:0)
$ 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)