grep 和 sed 中的相同模式 select 不同的值

Same pattern in grep and sed select different values

我想为 sed 创建一个模式,它将找出 'type="" 为此,我尝试使用模式

type=".*\?"

echo 'aa type="none" stretchChildren="first"' | sed s/'type=".*\?"'/hello/

以上是打印

的sed命令

aa hello

这意味着它选择 'type="none" stretchChildren="first"' for 'type=".*\?"'

下面是在相同字符串上使用相同模式的 grep 命令

 echo 'aa type="none" stretchChildren="first"' | grep -oP 'type=".*?"'

它给出输出

type="none"

不知道我在 sed 模式中遗漏了什么

有人可以帮我解决这个问题吗 sed 的输出应该是

aa hello stretchChildren="first"

sed 没有非贪婪模式匹配,因此使用 *?*\? 将不起作用。

如果您想获得与 grep 相同的输出,请使用不带 " - [^"]+ 的分组,而不是 ".*?":

sed -r 's/type="[^"]+"/hello/'

[]是一组字符,^是一个否定,所以[^"]表示任何不是"的字符。

对于 OSX 使用 -E 而不是 -r。 (-E 也适用于最新的 GNU sed,但在 --helpman sed 中都没有记录,所以我不推荐它)