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

#regex #sed

#регулярное выражение #sed

Вопрос:

Я хочу обновить только первый столбец в файле, но не первое вхождение. ниже приведен код, который я в настоящее время использую для обновления первого вхождения.

Для изменения первого вхождения даты

 sed 's/(....)-(..)-(..)/2/3/1/'
  

Я сталкиваюсь с некоторыми проблемами, например, иногда дата находится в правильном формате, который находится в первом столбце, поэтому приведенный выше код изменяет дату в третьем или четвертом столбце, поскольку это первое вхождение. чего я не хочу

ниже то, что я делаю:

 2018-09-14^Aaaa^Aq^ATEST^Abc^2018-09-14^A1^2018-09-14

sed 's/(....)-(..)-(..)/2/3/1/' 

2018/14/09^Aaaa^Aq^ATEST^Abc^2018-09-14^A1^2018-09-14
  

Некоторые строки в моем файле имеют правильный формат, а некоторые нет. Поэтому я хочу изменить первый столбец в файле, только если он не соответствует формату «гггг / мм / дд», и игнорировать, если он уже находится в формате «гггг / мм / дд».

Вывод, который я хочу

 $cat test.csv
2018/14/09^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14
2018-09-14^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14
To
$ cat output_test.csv
2018/14/09^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14
2018/14/09^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14
  

Комментарии:

1. 2018/14/09 в правильном формате гггг / мм / дд?

2. Не беспокоясь о гггг / мм / дд или гггг /дд / мм. Просто как изменить только в первом столбце, если оно совпадает.

Ответ №1:

С помощью GNU или OSX / BSD sed для -E включения ERES:

 $ sed -E 's:^([^-] )-([^-] )-([^^] ):1/3/2:' test.csv
2018/14/09^Aaa^Aa^ATEST^Abc^2018/14/09^A1^2018-09-14
2018/14/09^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14
  

Ответ №2:

С GNU sed:

 $cat test.csv |sed -E 's/^(w )-(ww)-(ww)/1/3/2/'
  

затем для реального редактирования:

 $ sed -i -E 's/^(w )-(ww)-(ww)/1/3/2/' test.csv >output_test.csv
  

Ответ №3:

Добавьте шаблон begin with(^) для соответствия:

 sed 's/^(....)-(..)-(..)/1/3/2/' file