我有包含以下格式行的文件:
2021-Jan-26 05:35 foo bar 2
2021-Jan-26 05:37 asdf 2 foo bar
2021-Jan-26 05:37 foo
我感兴趣的模式从位置 20 开始。因此,当我 grep 文件中查找特定模式时,我想跳过(不匹配)前 19 个字符。
因此,我想匹配该行中除前 19 个字符之外的任何位置的模式
在上面的示例中,如果我 grep for 2
,我只想匹配第 1 行和第 2 行。
我怎样才能做到这一点grep
?
答案1
使用 GNU 的选项grep
,它将忽略前 19 个字符并仅匹配您需要的模式:
grep -P "(?<=.{19})2" file
输出:
2021年1月26日 05:35 富吧2 2021年1月26日 05:37 asdf2富酒吧
答案2
您实际上确实想要匹配前 19 个,但将它们匹配为“任何内容”。
所以
grep '^....................*2'
有20个点。将^
图案锚定到行的开头。接下来的 19 个点分别匹配一个字符,实际上是跳过它们。然后来.*
匹配零个或多个字符,然后来2
匹配你想要的模式。
您可以通过以下方式提高效率
grep '^..................[^2]*2'
它匹配行的开头,然后是 19 个字符,然后是零个或多个2
不是2
.在这种情况下不会有任何显着差异,但如果正在搜索的模式更复杂,那么这种优化可能会有很大帮助。