Используйте sed, чтобы условно заключить строку в кавычки для всех файлов в каталоге - PullRequest
0 голосов
/ 18 октября 2018

У меня есть каталог, содержащий несколько сотен публикаций в блогах с frontmatter YAMLКаждый блок frontmatter имеет строку, начинающуюся с date:, за которой следует дата в формате ГГГГ-ММ-ДД.За некоторыми датами следует время, то есть 21:09.Некоторые даты заключены в одинарные кавычки, например, «ГГГГ-ММ-ДД».

Я хотел бы преобразовать все строки 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 для каждого файла в каталоге, я не могу определить, работает ли мое регулярное выражение или нет или нет.

Как настроить эту командузаставить его работать?

1 Ответ

0 голосов
/ 18 октября 2018

sed требует от вас экранирования многих специальных символов в регулярном выражении, включая ?(){}.Также sed использует обозначение \1 для замены вместо $1.Вы также можете упростить свое регулярное выражение, удалив часть date:, как при поиске, так и при замене.Это должно работать:

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