搜索文件中多行正则表达式的匹配项(无pcregrep)

阿德里安市长

问题:

没有pcregrep的情况下,如何在文件中找到多行正则表达式的匹配项?

我需要查找/打印每个事件的位置。

不幸的是,pcregrep不存在,我无权安装它。其他替代方法grep perl sed python等。

要搜索的正则表达式的示例是:

Text\nLine

语境:

脚本在几十个文件中提供了数百MB的结构化文本,但不幸的是,由于某些原因,缺少了几行。我确实需要检查那些行是否缺失,从而搜索上一行和下一行的顺序。

Text
Missing //this line is sometimes missing.
Line

编辑:

可能的输入

example.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 -n '/^Text/{N;/^Text\nLine/=;D;}' file
10

sed脚本Text在行的开头查找字符串找到后,它会将下一行添加到其缓冲区中,并\n在中间插入一行

如果缓冲区现在匹配,^Text\nLine则使用中的=命令输出当前行号sed输出的行号是Line文件中该的行号

请注意,尽管第二个正则表达式似乎在文件中的换行符上匹配,但事实并非如此。它在其内部缓冲区中的换行符上匹配,N当我们从文件中读取下一行时,使用命令将其放在那里

如果要将其应用于多个文件,则可能会在循环中使用它:

for name in pattern; do
    printf 'Processing %s...\n' "$name"
    sed -n '/^Text/{N;/^Text\nLine/=;D;}' "$name"
done

其中pattern是与您感兴趣的文件匹配的普通文件名遍历模式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java中打印正则表达式匹配项

python中具有多个匹配项和负条件的多行正则表达式

在两个列表中搜索正则表达式匹配项,如果存在则弹出

Python-在字节文件中替换正则表达式匹配项

Python Glob正则表达式文件搜索,其中包含多个匹配项的单个结果

正则表达式以匹配多行

在Sublime Text中匹配多行正则表达式

尝试在正则表达式的帮助下在多行中找到匹配项

使用正则表达式逐行搜索纯文本文件,并根据匹配项选择樱桃选择行

MariaDB / Mediawiki中的多行正则表达式匹配

在Ansible中的文件中搜索正则表达式

pcregrep如何强制返回正则表达式的第一个匹配项

正则表达式以匹配CSS文件中的ID?

如何使用搜索/替换在Vim中访问正则表达式匹配项?

大文件中的正则表达式搜索模式

文件中单个匹配项的正则表达式字符串替换

使用正则表达式查找不匹配项(多行)

正则表达式多行匹配

在Bash中查看文件中的所有正则表达式匹配项

正则表达式,如何排除匹配中的搜索

匹配网址正则表达式中的文件路径

正则表达式匹配多行搜索

在 Python 中匹配多行正则表达式模式

在 xml 文件中搜索的正则表达式

正则表达式匹配在 findall 和搜索工作时返回“无”

使用正则表达式从多行字符串中查找最短的匹配项

正则表达式匹配多行

正则表达式包括搜索中的现有匹配项

正则表达式匹配 AWS 凭证文件中的多行