использование sed для изменения формата даты в файле с месяца день, год на день месяц год

Попробуйте это,

cd /source/dir/path
find. -type d -exec mkdir -p -- /destination/directory/{} \;
  • . -type dРекурсивный список каталогов по текущему пути.
  • mkdir -p -- /destination/directory/{}создать каталог в месте назначения.

Это основано на find, который поддерживает раскрытие {}в середине слова-аргумента.

1
26.11.2020, 19:53
1 ответ

Вот один из способов предположить, что ваши данные такие, как вы показываете, и у вас нет ничего похожего на Foo 12, 0000, что не следует рассматривать как дату):

$ sed -E 's/([A-Z][a-z]+) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
J 14, 2022
error 3, bye

Ищем заглавную букву, за которой следует одна или несколько строчных букв ([A-Z][a-z]+), затем пробел и одну или две цифры ([0-9]{1,2}), затем запятую и пробел и ровно 4 цифры, за которыми следует слово -граница(\b:переход слова в не -слово; это будет соответствовать пробелу, концу строки или чему-то еще, что не является символом слова ). Скобки заключают соответствующие группы в \1, \2и \3, которые мы затем используем для замены.

Обратите внимание, что это не работает для J 14, 2022, так как это недопустимая дата. Например, M 14 2020— это 14 марта или мая? Если вы действительно хотите сопоставить подобные вещи, вы можете попробовать:

$ sed -E 's/([A-Z][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
14 J 2022
error 3, bye

Наконец, вы также можете сделать это немного более конкретным, ища только заглавные буквы, которые можно найти в качестве первой буквы месяца:

sed -E 's/([JFMASOND][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
3
18.03.2021, 22:46

Теги

Похожие вопросы