#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