我想使用shell命令grep或搜索匹配两个不同模式的两个连续行,例如匹配line1:“abc”,对于line2:“def”。因此,对于以下文本,应该有一个匹配:第4行和第5行。
Toast.makeText(this, Integer.toString(paths.size()),Toast.LENGTH_SHORT).show();
当我找到这样的匹配时,我想在比赛前打印包括N行。有任何想法吗?感谢。
答案 0 :(得分:4)
在GNU grep
模式下使用PCRE
,启用-P
标记,
grep -ozP ".*abc.*\n.*def.*" file
将pcregrep
用于输入文件
cat file
1234
abc-noise
6789
abc-noise
def-noise
def-noise
1234
noise-abc-noise
noise-noise-def
对于多行模式匹配,请执行
pcregrep -M 'abc.*\n.*def' file
abc-noise
def-noise
noise-abc-noise
noise-noise-def
对于模式匹配前的行,请使用-B
GNU grep
标记
pcregrep -B2 -M 'abc.*\n.*def' file
abc-noise
6789
abc-noise
def-noise
def-noise
1234
noise-abc-noise
noise-noise-def
有关-M
页面中的标记-B
和man pcregrep
的更多信息,
-M, - 多线 允许模式匹配多行。给出此选项时,模式可能有用地包含文字换行符和内部 出现^和$字符。成功匹配的输出可能包含多行,最后一行是其中的一行 比赛结束。如果匹配的字符串以换行符结尾,则输出结束于该行的末尾。
-B number, - before-context = number 在每个匹配行之前输出上下文行。如果正在输出文件名和/或行号,则使用连字符分隔符 上下文行的冒号。在每组行之间输出包含“ - ”的行,除非它们在输入中实际上是连续的 文件。
答案 1 :(得分:1)
如果要在整个目录中进行递归搜索,请扩展@Inian的最佳答案:
find my_code_dir/ -type f -name "*.py" -exec pcregrep -B2 -M 'except.*\n.*pass' {} +
此特定命令将在except
文件中查找包含pass
的出现行,紧随其后的是包含.py
的行。
答案 2 :(得分:0)
#!/bin/bash
a=''
b=''
while read c; do
a=$b;
b=$c;
if [ `echo "$a" |grep "abc"` ] & [ `echo "$b" |grep "def"` ]; then
echo $a;
echo $b;
break;
fi
done
启动:
$./find2pat
wegweg
egwergwerg
sdfabcerg
rrheedef4
输出:
sdfabcerg
rrheedef4