sed 只打印该行的第一个模式匹配

Gyp*_*aut 6 sed

我有一些数据,比如

<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 正则表达式中,可以通过附加问号使*+说明符变得非贪婪,.*?任何东西也是如此,但尽可能少的字符/字节。

  • `cut -d \" -f 2` 应该足够了 (3认同)