我需要将以下内容匹配: (tt\d{1,10}) 在文件以 txt 结尾的文件中。
我尝试过 grep 和 ack-grep 但没有结果。
ack-grep -G \.txt$ -g "(tt\d{1,10})"
答案1
与ack-grep
,看起来您正在寻找
ack-grep -uhoG '\.txt$' 'tt\d{1,10}'
这或多或少相当于find
您“最终得到”的命令,顺便说一下,它可以优化为:
find . -name '*.txt' -exec grep -Eo 'tt[0-9]{1,10}' {} +
grep
以避免每个 txt 文件运行一个命令。
您可能还想考虑添加 a-type f
以避免必须在目录或符号链接或设备中搜索文本...(尽管我同意它们很少有名称(符号链接除外)*.txt
)。
另请注意,-o
选项grep
是 GNU 特定的,并且 GNU grep 还具有-r
递归搜索目录的选项,但请注意旧版本的 GNU grep 会下降到目录的符号链接中,因此find
如果您没有最近的grep
。
答案2
我用于find
这种事情,并让它grep
在匹配的文件上执行。使用上面的 @dubiousjim 的正则表达式:
find ./ -name "*.txt" -exec grep -Hn --color=auto 'tt[0-9]\{1,10\}' {} \;
更新
很抱歉让这一点变得臃肿,但我觉得我应该返回并进一步详细解释这些选项...
上面的find
命令本质上是两个单独的命令,通过“-exec”选项合并为一个。
我希望这第一点是相当不言自明的:-
find ./ -name "*.txt"
但 find 的-exec
子命令有它自己的特殊语法。
{}
特定于find
及其-exec
选项,如下所示\;
。{}
替换为完整匹配的路径名,并且\;
表示 exec 程序的命令行参数的结尾,在本例中为grep
。
grep -Hn --color=auto 'regex' {} \;
我使用这些选项尝试通过为每个匹配的表达式grep -r
打印颜色、行号 ( -n
) 和文件名 ( )来复制 的外观。-H
请注意,别名在 exec'd by 命令中不起作用find
,这就是我'--color=auto'
手动添加的原因。