regex - 使用 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" {} \;
这应该创建四个组:
- $1 开盘价,如果有的话
- $2 日期
- $3 收盘价,如果有的话
- 4 美元的时间,如果有的话
该命令运行时未返回任何错误,但日期行均未更改。我使用http://rubular.com来测试正则表达式模式,这似乎是正确的。
值得我使用 macOS,因此它的变体find
和sed
. 由于除了目录中每个文件的文件之外,我没有得到任何输出,.bak
因此我无法判断我的正则表达式是否失败或替换是否失败。
如何调整此命令以使其工作?
解决方案
sed
要求您转义正则表达式中的许多特殊字符,包括?(){}
. 还sed
使用\1
符号代替$1
. 您还可以通过删除date:
搜索和替换中的部分来简化您的正则表达式。这应该有效:
sed -e "s/'\?\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*$/\"\1\"/"
推荐阅读
- python-3.x - 如何使用 Matplotlib 更改我的代码以停止 DepreciatonWarning:使用或从“集合”导入 ABC
- lua - 如何修改由 C API 创建的元表?
- amazon-web-services - 禁用 AWS Api Gateway http --> https 307 重定向
- c# - 如何让 c# 从网站获取所有 URL 并将它们放入列表中
- php - 在单个函数中如何在 CodeIgniter 中执行两个重定向方法?
- firebase - 现在将服务器值设置为时间戳
- swift - 当应用程序最小化时,UILabel.text 不起作用,手机被锁定并且应用程序从 callkit 使用密码打开(没有密码可以正常工作)
- parse-platform - 为什么我有时会得到嵌入的属性,有时却没有?
- node.js - 如何在 AWS X-Ray 管理控制台中打印自定义子分段?
- json - PostgreSQL 将 JSON 对象作为键值对返回