使用我们的 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