用grep批量获取“<”和“>”里面的文字

Get the text inside "<" and ">" with grep in batch

我试图在“<”和“>”内的 file.txt 中 grep 一个词两天,但无法得到它。例如,我在 file.txt 中有类似的东西:

30993250 (<someone@mail.com> 2014-09-22 12:41:56 +0200 365)

它来自 git blame -L 365,+1 path\to\file.cpp-e,我只想恢复里面的电子邮件。我正在尝试以下代码:

grep -oP '(?<=\<)\w+(?= \>)' ..\log\file.txt > ..\log\result.txt

grep -Po '(?<=\().*(?=\))' ..\log\file.txt > ..\log\result.txt

但是没有用,提示文件语法错误或找不到指定路径。我不明白,我尝试了很多组合,但没有任何效果...

我想说我在 Windows 下使用批处理。请问有人可以帮助我吗?

编辑: 我找到了一个使用 ASCII table 的解决方案:

grep -oP '["4].*["6]' ..\log\file.txt > ..\log\result.txt

但是像这样显示“<>”字符:

<someone@mail.com>

我怎样才能删除它?

谢谢

grep 将查找并显示 ,它不会从一行中删除任何内容。

但在您的情况下,您可以读取结果并删除 <> 个字符。

grep -oP '["4].*["6]' ..\log\file.txt > ..\log\result.txt
setlocal EnableDelayedExpansion
set /p line=   < ..\log\result.txt
set "line=!line:<=!"
set "line=!line:>=!"
echo !line!

perl 模式 -P 允许向后看。注意 - 我正在为 Windows.

使用 GNU grep
grep -P -o "(?<=<)[^>]+(?=>)" ..\log\file.txt >..\log\result.txt

对于无法访问 grep 的 Windows 批处理用户(一些公司不允许第 3 方 exe 程序),您可以使用我的 JREPL.BAT - 纯脚本正则表达式 search/replace在 Windows.

上本地运行的实用程序
jrepl "<([^>]+)>"  /jmatch /f ..\log\file.txt /o ..\log\result.txt