【问题标题】:Same pattern in grep and sed select different valuesgrep 和 sed 中的相同模式选择不同的值
【发布时间】:2016-06-21 05:26:41
【问题描述】:

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

type=".*\?"

echo 'aa type="none" stretchChildren="first"' | sed s/'type=".*\?"'/hello/

上面是打印的 sed 命令

你好

这意味着它为 'type=".*\?"' 选择了 'type="none" stretchChildren="first"'

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

 echo 'aa type="none" stretchChildren="first"' | grep -oP 'type=".*?"'

它给出输出

type="none"

不知道我在 sed 模式中缺少什么

有人可以帮我吗 sed 的输出应该是

你好,stretchChildren="first"

【问题讨论】:

  • 你在哪个平台上?您正在对grepsed 的方言做出不可移植的假设。看起来您可能在 Linux 上或使用 GNU sedgrep,但也可以这么说。
  • 为什么不使用简单的模式:type="[^"]*",它在 sedgrep 中的工作方式相同,无需额外选项,并且可以执行您想要的操作。

标签: bash shell sed grep non-greedy


【解决方案1】:

sed 没有非贪婪模式匹配,因此使用 *?*\? 将不起作用。

如果您想获得与 grep 相同的输出,请使用不带 " 的分组 - [^"]+ 而不是 ".*?"

sed -r 's/type="[^"]+"/hello/'

[] 是一组字符,^ 是一个否定,所以[^"] 表示任何不是" 的字符。

对于 OSX,使用 -E 而不是 -r。 (-E 也适用于最新的 GNU sed,但在 --helpman sed 中都没有记录,所以我不推荐它)

【讨论】:

  • [^"]+ - 在这个模式中是什么意思
  • "以外的所有字符至少出现一次(+
  • ++;如果您使用 -E 而不是 -r,它也可以在 OSX 上运行(在这种特殊情况下)。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多