使用sed有条件地将字符串括在目录中所有文件的引号中

时间:2018-10-17 23:16:42

标签: regex sed find

我有一个目录,其中包含数百个使用YAML主题发布的Weblog。每个前题块都有一行以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,因此使用了findsed的变体。由于除了目录中每个文件的.bak文件之外没有输出任何信息,所以我无法确定我的正则表达式是否失败或替换失败。

如何调整此命令使其起作用?

1 个答案:

答案 0 :(得分:0)

Answer.objects.filter(answer__contains=response).exists()要求您在正则表达式中转义许多特殊字符,包括sed。此外,?(){}使用sed表示替换而不是\1。您也可以通过删除$1部分来简化正则表达式,就像在搜索和替换中一样。这应该起作用:

date: