首页 > 解决方案 > 使用 sed 为目录中的所有文件有条件地将字符串括在引号中

问题描述

我有一个目录,其中包含数百个使用 YAML frontmatter 发布的博客。每个 frontmatter 块都有一行date:以 YYYY-MM-DD 格式开头,后跟日期。一些日期后面是时间,即 21:09。一些日期用单引号括起来,即'YYYY-MM-DD'。

我想将所有date:行转换为这种格式:date: 'YYYY-MM-DD'.

一些示例日期线:

date: '2009-11-23'   
date: 2013-01-20 20:37
date: 2013-01-21 1:40

我有这个命令:

find . -type file -exec sed -i.bak -e "s/date: (')?([0-9]{4}-[0-9]{1,2}-[0-9]{1,2})(')?( .*)?/date: \"$2\"/g" {} \;

这应该创建四个组:

该命令运行时未返回任何错误,但日期行均未更改。我使用http://rubular.com来测试正则表达式模式,这似乎是正确的。

值得我使用 macOS,因此它的变体findsed. 由于除了目录中每个文件的文件之外,我没有得到任何输出,.bak因此我无法判断我的正则表达式是否失败或替换是否失败。

如何调整此命令以使其工作?

标签: regexsedfind

解决方案


sed要求您转义正则表达式中的许多特殊字符,包括?(){}. 还sed使用\1符号代替$1. 您还可以通过删除date:搜索和替换中的部分来简化您的正则表达式。这应该有效:

sed -e "s/'\?\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*$/\"\1\"/"

推荐阅读