我对 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
(在模式中将匹配文字(\bword 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)