【发布时间】:2020-08-05 04:58:21
【问题描述】:
在下面的示例中,如何返回第 n 个模式 1 和第 m 个模式 2 之间的 字符串,其中模式 1 和模式 2 在字符串中可能出现多次?
更好的例子:
zz this is string xx zz another string xx third string zz xx and a tail xx
在第二个 zz 和第三个 xx 之间你会如何返回?
即
another string xx third string zz
编辑:对于任何寻找这个的人来说,正则表达式中的“捕获组”和“前向/后向引用”似乎是此任务所需的术语..Helpful information here。
以上编辑
对不起最初的助手。你的答案很好,我的例子选得不好。
请随时从此处删除以整理此问题。为了提供的原始答案的完整性,我只是留下它。
糟糕的原始问题和示例:
echo '1a 2b 3c 4d 5e 6f 7g 8h 9i 0j'
如果你能想出一个没有尾随空格的解决方案,那就加分。我知道可以通过管道再次删除前导/尾随空格,但我很好奇是否有更整洁的解决方案。我期望的输出(不包括单引号)是:
'3c 4d 5e 6f' 或 ' 3c 4d 5e 6f '
- 我正在使用 sed/awk,因此希望它可以扩展到匹配 pattern1 的第 n 次出现和 pattern2 的第 m 次出现,而不是仅仅匹配单个字符(空格) .
我尝试了一些变体。我相信这是最接近 sed 的正确方法:
echo '1 2 3 4 5 6 7 8 9 0' | sed -n 's/.*[ ]{2}.*[ ]{4}.*/\1/p'
但是,它返回错误:
sed -e expression #1, char 28: invalid reference \1 on `s' command's RHS
【问题讨论】:
-
会的。我现在基于两个快速正确的答案意识到这个例子是不够的。我会补充一些更合适的。
-
一些带有一些边缘情况的例子会有所帮助。现在很难理解你真正想要做什么。
-
希望编辑后的问题和示例更好。我认为“捕获组”是我可能追求的,正如我第一次回答我糟糕的措辞时提到的那样。感谢那些已经做出贡献的人。
-
echo '1 2 3 4 5 6 7 8 9 0' | awk '{for (i=3;i<=6;i++) printf (i==3)?"%s":" %s",$i; print""}'??