问题:
在没有 pcregrep 的情况下,如何在文件中找到多行正则表达式的匹配项?
我需要查找/打印每次出现的位置。
不幸的是,pcgrep 不存在,我无权安装它。其他选择是grep
perl
sed
python
等。
要搜索的正则表达式示例如下:
Text\nLine
语境:
一个脚本在几十个文件中提供了数百 MB 的结构化文本,但遗憾的是缺少一些行(由于多种原因)。我确实需要检查这些行在哪里丢失,从而搜索前一行和下一行的顺序。
Text
Missing //this line is sometimes missing.
Line
编辑:
可能的输入
例子.txt
Text
Missing
Line
Text
Missing
Line
Text
Line
Text
Missing
Line
可能的输出:
example.txt,第 10 行
一些没有成功的尝试:
pcregrep
# command not found
apt-get install pcregrep
# no permission, no su credentials, distro don't provide pcregrep, outdated sources, customer does not want changes on the serve, etc.
sed -r 's#(Text\nLine)#\1#' ./*
# print all lines, not only matches, no indication of file or line, etc.
grep 'Text\nLine' ./*
# Does not works on multi-lines
sed -n '/Text/,/Line/{p}' ./*
# Not the same regex, does not indicate result lines, etc.
Unix 工具通常是面向行的,因此无法使用标准工具箱在多行输入上应用正则表达式。
sed
可以以能够检测到您正在查找的行的方式处理文件,但我们严格使用对各个行的操作来执行此操作:该脚本在行
sed
首查找字符串。Text
找到后,它将下一行附加到其缓冲区,中间有一个\n
。如果缓冲区现在匹配,则使用 in 中的命令
^Text\nLine
输出当前行号。输出的行号是文件中的行号。=
sed
Line
请注意,虽然第二个正则表达式似乎与文件中的换行符匹配,但事实并非如此。它匹配其内部缓冲区中的换行符,
N
当我们从文件中读取下一行时,我们使用命令将其放置在那里。如果要将其应用于多个文件,您可能会在循环中使用它:
where
pattern
将是与您感兴趣的文件匹配的普通文件名通配模式。如果
vim
已安装,您可以在ex
以下模式下使用它:另请参阅
z
提供上下文的命令。但这不会打印文件名。一种不太有效
perl
的方法可能是:这将打印文件名以及发生匹配的行号。
此外,行计数器 ($.) 在到达每个文件的 eof 时会重置。