我需要打印与特定模式匹配的文件列表 - 出现在其他两个字符串之间的字符串。我怎么做。我不想提取文本,只需列出与此模式匹配的文件。
PREFETCH
我需要一个命令来匹配并列出所有包含出现在这两个字符串之间的字符串实例的文件名:advanced_override.begin
和advanced_override.end
。这些文件都存在于同一目录中,因此该命令应搜索当前目录“.”的内容并列出与指定模式匹配的文件名。
更新:
它必须有这样的东西:advanced_override.begin <lots of text> PREFTECH <lots of other text> advanced_override.end
。我需要它来匹配这两个字符串之间的某个字符串,并且之前或之后可能有很多其他文本PREFETCH
。
更新二:
输入文件是 XML 文件。以advanced_override.begin
和开头的部分advanced_override.end
可能很大,包含很多行文本。
答案1
pcregrep
如果可用的话,您可以使用-l
开关来仅列出匹配的文件名:
pcregrep -lM '(?s)advanced_override\.begin.*PREFETCH.*advanced_override\.end' ./*
PREFETCH
这会在多行模式下搜索中间的两个字符串。它假设当前目录中只有文本文件(如果不是这种情况,您可以使用循环for
或find
),并且每个文件都包含一个以 开头advanced_override.begin
和结尾的部分advanced_override.end
- 对于多个部分,最好使用之前的负向前瞻PREFETCH
,例如:
pcregrep -lM '(?s)advanced_override\.begin(?:(?!advanced_override\.end).)*PREFETCH.*advanced_override\.end' ./*
答案2
上述警告,这里和这里,但特别是这里关于尝试使用正则表达式解析 XML 文件的信息受到了广泛关注。一般来说,XML 文本可能不限于单行,但由于在这种情况下您正在搜索特定的单个单词,并且假设它们本身不会分解为多行,因此您可以使用简单的 awk 脚本保持“状态”。如果它看到下一个预期单词,则会增加该state
值。如果它以正确的顺序找到所有预期的模式,它会设置一个found
变量,然后我们根据该变量生成返回代码:
#!/bin/sh
for f in *
do
awk '
/advanced_override\.begin/ { state=1; }
/PREFETCH/ && state == 1 { state=2; }
/advanced_override\.end/ && state == 2 { found=1; }
END {
if (found)
exit 0
else
exit 1
}
' "$f" && printf "Found in: %s\n" "$f"
done
给定这 3 个示例输入文件:
$ cat input1
junk
advanced_override.begin other text
other text
PREFETCH other text
other text
advanced_override.end
$ cat input2
just some stuff
advanced_override.end
$ cat input3
junk
advanced_override.begin other text other text PREFETCH other text other text advanced_override.end
junk
该脚本的示例运行会产生:
Found in: input1
Found in: input3