如何使用grep搜索2个或更多括号和单词大小写

时间:2015-10-26 16:29:57

标签: bash grep

我正在尝试在包含大约80个txt文件的路径中搜索几个字符串。

我正在尝试搜索!!,??,;,大写和括号。 我也试图搜索是否有超过4个单词大写,但我只是不知道该怎么做

这是我做的:

grep -lr '!!\|??\|;\|(.*(' path

有人可以帮我吗?

以下是输入示例:

FILE1.TXT:

ryan went over there !!

FILE2.TXT:

am I going there??

file3.txt:

how about I GO TO THE PARK TODAY and not TOMORROW

file4.txt:

This is (not) (valid)

file5.txt:

to go; or not to go

输出应该是这样的:

path/file1.txt
path/file2.txt
path/file3.txt
path/file5.txt

3 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

grep -Er '\?\?|\!\!|\(.+\).+\(.+\)|([A-Z]+\b.){4,}|\;' /path/to/files/*.txt

输出:

./1.txt:ryan went over there !!
./2.txt:am I going there??
./3.txt:how about I GO TO THE PARK TODAY and not TOMORROW
./4.txt:This is (not) (valid)
./5.txt:to go; or not to go

grep -Elr将输出:

./1.txt
./2.txt
./3.txt
./4.txt
./5.txt

正则表达式搜索:

  1. ...
  2. !!
  3. ()在一行中至少使用过两次
  4. 一行中有四个或更多大写单词

答案 1 :(得分:0)

你的记号已关闭。在现代grep中,您需要反斜杠,就像反斜杠垂直条进行交替一样。更方便的是,您可能希望切换到grep -E以获得反斜杠语法;但是你需要\(来匹配文字左括号。

但无论如何,在大括号内,最多只能有两个数字:重复次数的下限和上限。

但是,在这种情况下,由于没有限制上下文,\({2)将匹配任意大量的左括号中的前两个。换句话说,如果有超过四个parens,\({2,4}将无法匹配(尽管实际匹配将在四个之后结束,因为您将能够看到例如grep -o)。如果您需要限制为不超过四个,则需要提供某种尾随上下文,例如($|[^(])

要查找包含多个但不到五个不相邻的开口的pirens的行,请尝试类似

的内容
^[^(]*(\([^(]*){2,4}$

答案 2 :(得分:0)

grep -lr '!!\|??\|;\|(.*(' path

是你想要的。 (.*(将匹配包含(至少)两个空括号的行,其中包含任意文本。

为了便于阅读,您可以尝试

grep -lr -e '!!' -e '??' -e ';' -e '(.*(' path