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会受到影响
正如你所看到的差异是.*
在"
没有空格之后在第二个正则表达式中使用贪婪模式.
它之所以不同表现,因为有一个双引号后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
因为否定的字符类 [^"]*
将匹配,直到它接下来"
直到"
输入的最后一个为止.*
.
归档时间: |
|
查看次数: |
40 次 |
最近记录: |