【问题标题】:Grep regex overlap match [closed]Grep正则表达式重叠匹配[关闭]
【发布时间】:2021-02-16 12:17:23
【问题描述】:

给定字符串:lolololololol

当我尝试查找lol 的数量时,Grep 不会重叠匹配。

echo "lolololololol" | grep -o 'lol' | wc -l

上面的 sn-p 返回3。事实上,我想要的答案是有6lol。对于这种情况,我知道我可以简单地用 grep 搜索 lo,但这个示例旨在代表一般问题,即如何允许 grep 或其他搜索工具查找重叠匹配项。

其他示例

echo "1 2 3 4 5" | grep -E '(^| )[0-9]( |$)'
echo "10101" | grep '101'

可以在以下位置找到最佳解决方案 https://unix.stackexchange.com/questions/276159/grep-that-works-with-overlapping-patterns

【问题讨论】:

  • 很高兴你在你的问题中表现出了你的努力。您能否在您的问题中添加输入和预期输出示例,然后让我们知道以便更好地理解问题。
  • 我不明白为什么[^ ]+ 不够用。你能提供当前输出与期望输出吗?
  • 这部分[^ ] 匹配除空格以外的任何字符,这是有意的吗?
  • 看起来问题过于简单化了,而真正的问题却大不相同。请解释您遇到的现实问题。至少,请提供给定示例输入的预期输出。
  • 添加预期输出后,“我不明白为什么[^ ] 不够”x 2。

标签: regex bash awk sed grep


【解决方案1】:

您似乎希望从一场比赛结束到下一场比赛开始之间捕获空间:

.*?(?=( [^\r\ ]+ ))

grep:

#!/bin/bash

string=" 1 -1 1 
 a bc d 
 alpha beta delta "

echo "$string" | grep -Po '.*?(?=( [^\r\n ]+ ))'

使用https://www.jdoodle.com/test-bash-shell-script-online/ 它不会显示空格,但我相信它们就在那里。

【讨论】:

  • 请注意echo $string(未加引号)将所有换行符替换为空格。
  • @BenjaminW。我不是 bash 专家。我的答案可以保存吗?
  • 这个答案在最后去掉了最后一句话,包括echo "$string"
  • 如果您引用 echo "$string",则保留换行符,请参阅 this Q&A
  • @Explorer 说实话,我不完全确定我在 bash 中做什么。这是我能得到的最接近的了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2017-11-10
  • 2010-09-24
相关资源
最近更新 更多