Regex 如何在unix脚本中提取和打印单行文本中的多个正则表达式匹配项

Regex 如何在unix脚本中提取和打印单行文本中的多个正则表达式匹配项,regex,perl,unix,sed,awk,Regex,Perl,Unix,Sed,Awk,我有一个单行文件,如下所示 blah blah <myxml>123</myxml> blah blah blah <myxml>5645</myxml> blah blah blah blah 胡说八道123胡说八道5645胡说八道 假设我已经计算出一个正则表达式来查找*,那么如何编写unix脚本来提取和打印嵌入在我的单行中的所有xml片段 i、 e.产生以下输出: <myxml>123</myxml> <myx

我有一个单行文件,如下所示

blah blah <myxml>123</myxml> blah blah blah <myxml>5645</myxml> blah blah blah blah
胡说八道123胡说八道5645胡说八道
假设我已经计算出一个正则表达式来查找
*
,那么如何编写unix脚本来提取和打印嵌入在我的单行中的所有xml片段

i、 e.产生以下输出:

<myxml>123</myxml>
<myxml>5645</myxml>
123
5645

这对
grep
来说是一份好工作:

$ grep -Po '<\w*>\d*</\w*>' file
<myxml>123</myxml>
<myxml>5645</myxml>
$grep-Po'\d*'文件
123
5645
在表达式中

  • 匹配任何
    任何
  • \d*
    匹配任意数量的数字
  • grep-Po
    用于执行Perl正则表达式,并且o仅打印匹配结果
使用grep,您可以执行以下操作:

s='blah blah <myxml>123</myxml> blah blah blah <myxml>5645</myxml> blah blah
grep -o '<[^>]*>[^<]*<[^>]*>' <<< "$s"
<myxml>123</myxml>
<myxml>5645</myxml>
s=”胡说八道123胡说八道5645胡说八道

grep-o']*>[^'使用Perl oneliner,假设标记名中没有空格

cat input.txt | perl -ne "$\=$/; print for /(<\S+?>\d+<\/\S+?>)/g"
cat input.txt | perl-ne“$\=$/;为/(\d+)/g打印”

使用正向前瞻和反向前瞻

$ grep -oP '(?<= )<[^ ]+(?= ) ' file
<myxml>123</myxml> 
<myxml>5645</myxml> 

$grep-oP'(?你真的不需要
cat
,因为
perl
可以直接从文件中读取。这个问题被标记为
unix
。你会后悔在你的命令中那样使用双引号。@mob我使用Windows!并用
unxutils
对它进行了测试。这就是为什么我有
和我在一起:(谢谢-我收到了很多回复,最终使用了不同的解决方案-但是非常感谢您的回复,我相信这对其他人也会有用!谢谢-我收到了很多回复,最终使用了不同的解决方案-但是非常感谢您的回复,我相信这对其他人也会有用!