为什么空格会导致sed中记忆的模式输出不同的东西

ras*_*n58 6 regex bash shell sed regex-greedy

我试图通过终端获取此xml行中值条目的值,所以我使用sed.

abcs='<param name="abc" value="bob3" no_but_why="4"/>'

echo $abcs | sed -e 's/.*value="\(.*\)" .*/\1/'
echo $abcs | sed -e 's/.*value="\(.*\)".*/\1/'
Run Code Online (Sandbox Code Playgroud)

输出是:

bob3
bob3" no_but_why="4
Run Code Online (Sandbox Code Playgroud)

为什么没有空间的第二种方式导致的不仅仅是我想要打印出来的?为什么\ 1会受到影响

anu*_*ava 7

正如你所看到的差异是.*"没有空格之后在第二个正则表达式中使用贪婪模式.

它之所以不同表现,因为有一个双引号后no_but_why=以及和.*是一个贪婪的模式匹配,直到最后"/>在第二个正则表达式.

在你的第一个正则表达式"\(.*\)"匹配只是"bob3"因为在此之后有一个空格使正则表达式引擎阻止.*匹配直到输入中的最后双引号.

为了避免这种情况,你应该使用否定的字符类而不是贪婪的匹配.

考虑这些sed命令示例:

sed -e 's/.*value="\([^"]*\)" .*/\1/' <<< "$abcs"
bob3

sed -e 's/.*value="\([^"]*\)".*/\1/' <<< "$abcs"
bob3
Run Code Online (Sandbox Code Playgroud)

现在你可以看到两个命令都产生相同的输出,bob3因为否定的字符类 [^"]*将匹配,直到它接下来"直到"输入的最后一个为止.*.