我有一些数据,比如
<td><a href="data1">abc</a> ... <a href="data2">abc</a> ... <a href="data3">abc</a>
Run Code Online (Sandbox Code Playgroud)
(将data在下面的代码中引用上面的行)
我需要data1在第一个之间","所以我做
echo 'data' | sed 's/.*"\(.*\)".*/\1/'
Run Code Online (Sandbox Code Playgroud)
但它返回我的最后一个字符串之间"和"往常一样,即在这种情况下,它会返回我data3,而不是代替data1
为了得到data1,我最终做了
echo 'data' | sed 's/.*"\(.*\)".*".*".*".*".*/\1/'
Run Code Online (Sandbox Code Playgroud)
我如何在data1没有这么多冗余的情况下获得sed
ilk*_*chu 12
将.*在正则表达式是贪婪的,它匹配只要一个字符串作为它即可,这样相匹配的报价将是最后的。
由于这里的分隔符只有一个字符,我们可以使用倒括号组来匹配除引号之外的任何内容,即[^"],然后重复该组以匹配多个不是引号的字符。
$ echo '... "foo" ... "bar" ...' | sed 's/[^"]*"\([^"]*\)".*/\1/'
foo
Run Code Online (Sandbox Code Playgroud)
另一种方法是删除第一个引号之前的所有内容,然后删除从(新的)第一个引号开始的所有内容:
$ echo '... "foo" ... "bar" ...' | sed 's/^[^"]*"//; s/".*$//'
foo
Run Code Online (Sandbox Code Playgroud)
在 Perl 正则表达式中,可以通过附加问号使*和+说明符变得非贪婪,.*?任何东西也是如此,但尽可能少的字符/字节。
| 归档时间: |
|
| 查看次数: |
7315 次 |
| 最近记录: |