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
对它进行了测试。这就是为什么我有“
和我在一起:(谢谢-我收到了很多回复,最终使用了不同的解决方案-但是非常感谢您的回复,我相信这对其他人也会有用!谢谢-我收到了很多回复,最终使用了不同的解决方案-但是非常感谢您的回复,我相信这对其他人也会有用!