Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用非贪婪匹配?和格雷普_Regex_Bash_Grep - Fatal编程技术网

Regex 使用非贪婪匹配?和格雷普

Regex 使用非贪婪匹配?和格雷普,regex,bash,grep,Regex,Bash,Grep,我正在编写一个bash脚本,它分析一个html文件并 我想获得每一张…的内容。所以我的命令看起来像: $ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>' 如何使*非贪婪?如果您有GNU Grep您可以使用-p使匹配非贪婪: $ tr -d \\012 < price.html | grep -Po '<tr>.*?</tr>' 如果您没有GNU grep,并且HTML格式良好,

我正在编写一个bash脚本,它分析一个html文件并 我想获得每一张
的内容。所以我的命令看起来像:

$ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>'

如何使
*
非贪婪?

如果您有
GNU Grep
您可以使用
-p
使匹配非贪婪:

$ tr -d \\012 < price.html | grep -Po '<tr>.*?</tr>'

如果您没有
GNU grep
,并且HTML格式良好,您可以执行以下操作:

$ tr -d \\012 < price.html | grep -o '<tr>[^<]*</tr>'

$tr-d\\012*?
是一个Perl正则表达式。请将
grep
更改为

grep -oP '<tr>.*?</tr>'
grep-oP.*?'
试试perl风格的regexp

$ grep -Po '<tr>.*?</tr>' input
<tr>stuff</tr>
<tr>more stuff</tr>
$grep-Po.*?”输入
东西
更多的东西

非贪婪匹配不是
grep-E
支持的扩展正则表达式语法的一部分。如果有,请使用
grep-p
,或者切换到Perl/Python/Ruby/what have.(哦,
pcregrep

当然,如果你真的是说

<tr>[^<>]*</tr>
[^]*
您应该这样说;然后普通的old
grep
就可以了


您可以(繁琐地)扩展正则表达式以接受不是
的嵌套标记,但当然,最好使用适当的HTML解析器,而不是花费大量时间重新发现为什么正则表达式不是合适的工具。

或者,如果他只想要tr标记的内容:
grep-oP'(?最后一个示例(使用)[^@glennjackman好的一点,我将在回答中留下它,但是一般原则可能对旁观者有用。义务:
$ grep -Po '<tr>.*?</tr>' input
<tr>stuff</tr>
<tr>more stuff</tr>
<tr>[^<>]*</tr>