【问题标题】:Capturing matches with sed使用 sed 捕获匹配项
【发布时间】:2017-04-11 14:09:33
【问题描述】:

我刚刚开始使用 sed 进行试验,但并不真正了解匹配捕获是如何工作的:如果我有这样的代码来捕获两个单词 sed 's/\([a-z]*\).*\([a-z]*\).*/\1 \2/' 为什么没有捕获第二个单词?

Edit1:假设我有这个字符串:“棕狐跳过懒狗”。我想让 sed 匹配“棕色”,但它只匹配第一个单词

【问题讨论】:

  • 给我们上面sed命令不起作用的字符串(或)输入文件
  • * 是贪婪的.. 它会尝试尽可能多地匹配.. 虽然必须匹配整个表达式,但首选是让表达式首先匹配......并且作为@ 987654325@ 表示零个或多个匹配,.*[a-z]* 可以为空
  • 用空格符替换.*中的点...sed 's/\([a-z]*\) *\([a-z]*\).*/\1 \2/'
  • 谢谢 Sundeep,成功了!
  • 如果您使用+ 而不是*,它将需要“至少一个”,而不是“零或多个”。这对你也可能有用。最好编写正则表达式,这样对于要匹配的任何文本,只有一种匹配方式。不要让 sed 猜测你想如何匹配,否则它会变慢:stackoverflow.com/documentation/regex/977/backtracking/3180/…

标签: sed


【解决方案1】:

(引用 Sundeep,只是为了做一个 Q/A 对。)

.* 中的点替换为空格字符...

sed 's/\([a-z]*\) *\([a-z]*\).*/\1 \2/'

【讨论】:

  • 为了更好的回溯安全,请使用`{1,}`而不是`*`。我希望这不是扩展。
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2022-01-26
相关资源
最近更新 更多