使用 vims pattern-multi-items {n} 匹配行中的第 5 个空格

使用 vims pattern-multi-items {n} 匹配行中的第 5 个空格

使用我们的 crontab 中的这个条目

1 3 1 * * 查找 /var/log/tomcat/* -mtime +61 -type f -delete

我想匹配第 5 个空格字符,这样我就可以将命令部分与时间字段部分分开。Cron 可以有不同的格式,所以我希望能够将 DOW 匹配为 sun 或 0。

我在 vim 中使用的与第一个空格匹配的正则表达式是并用占位符“T”替换。

:g/\*/s/\(\ \)\{1\}/T/

我缺少什么来匹配第 n 个或第 5 个空格。这什么也没做

:g/\*/s/\(\ \)\{5\}/T/

我想生成在 cron 中运行命令的详细清单,以尝试平衡我们服务器上的负载。

附录

我知道上述搜索/替换中我做错了什么。

(\ \)\{5\}

由于空格之间有字符,因此它会扩展为五个空格,而不是第五个空格。

这项工作一直持续到第五个空格,但替换“\1”并不包括整个匹配的原子。

:g/*/s/\([0-9A-Za-z*\/,]* \)\{5}/\1 T /

替换后留下以下内容。

*  T find /var/log/tomcat/* -mtime +61 -type f -delete

我在寻找

1 3 1 * * T find /var/log/tomcat/* -mtime +61 -type f -delete

答案1

:g/\*/s/\(\ \)\{5\}/T/

这并不能像您希望的那样工作,因为它对 Vim 说“用 T 替换五个连续的空格”。

此命令应该可以按您需要的方式工作:

:g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+/\1T/

看看:help /\v你是否还不知道什么是“非常神奇”模式。

答案2

命令SedS建议Andreas 和 Andy 的作品非常适合这种事情:

:line1,line2SedS/ \+/ T /5

答案3

这个 grep regex 按照我期望的方式进行匹配,并按照我想要的方式进行替换。

:g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+(.*)/"\1";"\3"/

1 3 1 * * find /var/log/tomcat/* -mtime +61 -type f -delete

"1 3 1 * *";"find /var/log/tomcat/* -mtime +61 -type f -delete"

谢谢夏泽克回答。

使用 vim 中的 :bufdo,我可以编辑我打开的所有文件,进行我想要的替换,最后使用“|w”保存它们。因此,我拥有的我们服务器 cron 作业的所有 10 个副本现在都可以拆开来取了。

:bufdo g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+(.*)/"\1";"\3"/|w

相关内容