Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Bash grep和sed中的相同模式选择不同的值_Bash_Shell_Sed_Grep_Non Greedy - Fatal编程技术网

Bash grep和sed中的相同模式选择不同的值

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模式中缺少了什么 有人能帮

我想为sed创建一个模式,它将找到'type=“” 为此,我尝试使用该模式

类型=“*\?”

上面是打印的sed命令

你好

这意味着它为'type=“.\?”选择'type=“none”stretchChildren=“first”'

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

 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上或使用GNU
sed
grep
,但最好这样说。为什么不使用一个简单的模式:
type=“[^”]*“
sed
grep
中同样可以工作,没有额外的选项,并且做您想要做的事情。您在哪个平台上?您对
grep
sed
的方言做出了不可移植的假设。看起来你可能是在Linux上或者在使用GNU
sed
grep
,但是最好这样说。为什么不使用一个简单的模式:
type=“[^”]*”
,它在
sed
grep
中工作相同,没有额外的选项,并且做你想要的事情。[^]+-在这种模式中,除了
”+”,所有字符至少出现一次(
+
)是什么意思;如果您使用
-E
而不是
-r
,它也可以在OSX上工作(在这种特殊情况下)。[^”]+-在这种模式中,除了
”+”,所有字符中至少有一个(
+
)出现是什么意思?如果您使用
-E
而不是
-r
,它也可以在OSX上工作(在这种特殊情况下)。
 echo 'aa type="none" stretchChildren="first"' | grep -oP 'type=".*?"'
sed -r 's/type="[^"]+"/hello/'