2013-11-01 2 views
2

Что касается более раннего ответа, мне нужно изменить формат даты с yyyy-mm-dd на yyyy/mm/dd.изменение формата даты в linux bash

я получил ответ:

sed -i '[email protected],\(....\)-\(..\)-\(..\) @,\1/\2/\3 @' /home/Documents/blah.csv 

это прекрасно работает, только один экземпляр на одну строку. Однако одна строка может иметь многие из этих дат, как мне изменить команду sed, чтобы она выполнялась для каждого обнаруженного экземпляра (а не только для первого).

Пример документа:

2012-09-09,123143,2012-09-09,12837,2012-09-07,2131,2012-08-06,1237 
#and many more lines like that. 

после запуска патч в команду, я получаю это:

2012-09-09,123143,2012/09/09,12837,2012-09-07,2131,2012-08-06,1237 

Он работает только на втором экземпляре дату, Как я заставить его работать на всех из них ?

+0

Возможно, можно просто заменить '-' на'/'. Это будет идти с 'tr - - /' –

+1

Вы можете добавить букву 'g' в качестве модификатора в команду sed, чтобы она выглядела * g * в каждой строке. Однако убедитесь, что все совпадения остаются правильными. Пример: 'sed -i @ match @ replacement @ g 'document' –

+0

Да .. g работает .. но он всегда пропускает первый ... так что в основном я получаю это сейчас: 2012-09-09, 123143,2012/09/09,12837,2012/09/07,2131,2012/08/06,1237 – user2883071

ответ

2

Используйте флаг g, чтобы сделать замену для каждого матча в строке, а не только в первой. Кроме того, первая дата не сопоставляется, потому что ей не предшествует запятая.

sed -i '[email protected]\(....\)-\(..\)-\(..\)@\1/\2/\3/@g' /home/Documents/blah.csv 

Это исправляет несколько проблем:

  1. Не беспокоить соответствие запятые; 4-2-2 характер данных должен быть достаточным, и первое поле не сопоставляется, потому что ему не предшествует запятая.

  2. Добавить флаг g, следующий за окончанием @, чтобы заменить все совпадения, а не только первые.

  3. Добавлен забытый / между годом (\1) и месяц (\2).
Смежные вопросы