Bash grep和sed中的相同模式选择不同的值
我想为sed创建一个模式,它将找到'type=“” 为此,我尝试使用该模式 类型=“*\?” 上面是打印的sed命令 你好 这意味着它为'type=“.\?”选择'type=“none”stretchChildren=“first”' 下面是在同一字符串上使用相同模式的grep命令Bash grep和sed中的相同模式选择不同的值,bash,shell,sed,grep,non-greedy,Bash,Shell,Sed,Grep,Non Greedy,我想为sed创建一个模式,它将找到'type=“” 为此,我尝试使用该模式 类型=“*\?” 上面是打印的sed命令 你好 这意味着它为'type=“.\?”选择'type=“none”stretchChildren=“first”' 下面是在同一字符串上使用相同模式的grep命令 echo 'aa type="none" stretchChildren="first"' | grep -oP 'type=".*?"' 它提供输出 type=“无” 不知道我在sed模式中缺少了什么 有人能帮
echo 'aa type="none" stretchChildren="first"' | grep -oP 'type=".*?"'
它提供输出
type=“无”
不知道我在sed模式中缺少了什么
有人能帮我吗
sed的输出应为
aa hello stretchChildren=“第一”
sed
没有非贪婪模式匹配,因此使用*?
或*?
将不起作用
如果您想获得与grep相同的输出,请使用不带“
-[^”]+
的分组,而不是”*?“
:
[
,]
是一组字符,^
是一个否定,因此[^”]
表示任何不是“
的字符
对于OSX,请使用-E
而不是-r
。
(
-E
也适用于最新的GNU-sed,但它没有在--help
或-man-sed
中记录,因此我不推荐它)sed
没有非贪婪模式匹配,因此使用*?
或*?
将不起作用
如果您想获得与grep相同的输出,请使用不带“
-[^”]+
的分组,而不是”*?“
:
[
,]
是一组字符,^
是一个否定,因此[^”]
表示任何不是“
的字符
对于OSX,请使用-E
而不是-r
。
(
-E
也适用于最新的GNU-sed,但它没有在--help
或man-sed
中记录,所以我不推荐它)您在哪个平台上?您对grep
和sed
的方言做出了不可移植的假设。看起来您可能在Linux上或使用GNUsed
和grep
,但最好这样说。为什么不使用一个简单的模式:type=“[^”]*“
在sed
和grep
中同样可以工作,没有额外的选项,并且做您想要做的事情。您在哪个平台上?您对grep
和sed
的方言做出了不可移植的假设。看起来你可能是在Linux上或者在使用GNUsed
和grep
,但是最好这样说。为什么不使用一个简单的模式:type=“[^”]*”
,它在sed
和grep
中工作相同,没有额外的选项,并且做你想要的事情。[^]+-在这种模式中,除了“
”+”,所有字符至少出现一次(+
)是什么意思;如果您使用-E
而不是-r
,它也可以在OSX上工作(在这种特殊情况下)。[^”]+-在这种模式中,除了“
”+”,所有字符中至少有一个(+
)出现是什么意思?如果您使用-E
而不是-r
,它也可以在OSX上工作(在这种特殊情况下)。
echo 'aa type="none" stretchChildren="first"' | grep -oP 'type=".*?"'
sed -r 's/type="[^"]+"/hello/'