我正在尝试在包含大约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
答案 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 :(得分: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