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,但在 --help
和 man sed
中都没有记录,所以我不推荐它)
我想为 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,但在 --help
和 man sed
中都没有记录,所以我不推荐它)