![提取单词与该单词之后的第 n 个字符匹配之间的所有匹配项](https://linux22.com/image/170968/%E6%8F%90%E5%8F%96%E5%8D%95%E8%AF%8D%E4%B8%8E%E8%AF%A5%E5%8D%95%E8%AF%8D%E4%B9%8B%E5%90%8E%E7%9A%84%E7%AC%AC%20n%20%E4%B8%AA%E5%AD%97%E7%AC%A6%E5%8C%B9%E9%85%8D%E4%B9%8B%E9%97%B4%E7%9A%84%E6%89%80%E6%9C%89%E5%8C%B9%E9%85%8D%E9%A1%B9.png)
我有一个文件,我想在其中提取所有匹配项。
- 每个匹配都以一个单词开始,并以每个匹配后第 n 次出现某个字符(在本例中为第 2 次)结束。
- 在输出中包含单词和第 n 个匹配字符。
- 每行输出一个匹配项。
- 任何行上可以有任意数量的匹配项。
- 每个匹配都在同一行中:这意味着匹配不会用 CR、LF、CRLF 分成两行。
示例:提取“user”之间的所有匹配项和每个“user”后的“-”的第二个匹配项:
输入文件:
sample text user=data-no value /) xx- fdfd\n
abcd
abcd user-- example$% user-%&?@:-useruser**-#<>\"-user0-
gg-
--
useruser------data
user-user------data
输出文件优先考虑起始匹配(单词),然后向前搜索:
user=data-no value /) xx-
user--
user-%&?@:-
useruser**-#<>\"-
useruser--
user-user-
输出文件优先考虑结束的第 n 个匹配(单词)并向后读取:
user=data-no value /) xx-
user--
user-%&?@:-
user**-#<>\"-
user--
user-user-
答案1
我不明白“优先级”在这种情况下意味着什么,但你可以使用一个简单的 grep:
$ grep -Eo 'user([^-]*-){2}' file
user=data-no value /) xx-
user--
user-%&?@:-
useruser**-#<>\"-
useruser--
user-user-
([^-]*-){2}
匹配非连字符字符(可能为空)序列,后跟连字符字符两次。