如何使用grep递归查找包含带引号、换行的长HTML字符串的文件
递归查找含指定HTML片段的文件失败排查
需求说明
需要递归查找所有包含如下HTML代码片段的文件:
<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"> <head> <meta charset="utf-8"> <meta name="google" value="notranslate">
原有问题命令
尝试执行以下命令未成功:
grep --include=\*.html -FRnw "/path-to-dir" -e '<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52">\n <head>\n <meta charset="utf-8">\n <meta name="google" value="notranslate">'
错误原因
- grep默认是单行匹配模式,不会识别匹配内容里的
\n换行符,固定字符串匹配模式(-F参数)下也不会解析转义字符,引号内的\n只会被当成普通的\加n字符处理,无法匹配文件中的真实换行 -w参数要求匹配结果为完整单词,HTML标签属性值两端为引号,不符合单词边界规则,直接阻断匹配
解决方案
方案1:使用pcre2grep(兼容性更好)
支持原生多行匹配,还可以兼容不同文件的缩进差异:
pcre2grep -r --include="*.html" -M '<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52">\s+<head>\s+<meta charset="utf-8">\s+<meta name="google" value="notranslate">' /path-to-dir
参数说明:
-M:开启多行匹配模式,支持跨换行识别内容\s+:匹配任意数量的空白字符(包含换行、空格、制表符),不需要严格对应原片段的空格数量-r:递归扫描指定目录下的所有文件
方案2:使用GNU grep实现
如果系统只有GNU grep,可加-z参数用空字符分割文件内容,变相实现多行匹配:
grep --include="*.html" -rPzo '<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52">\n <head>\n <meta charset="utf-8">\n <meta name="google" value="notranslate">' /path-to-dir
内容的提问来源于stack exchange,提问作者standac
相关产品推荐
相关产品推荐

