изменить формат даты с ДД / ММ / ГГГГ на ГГГГ-ММ-ДД с помощью sed - PullRequest
0 голосов
/ 17 февраля 2019

Я делаю:

sed -e 's|\([0-9][0-9]\)/\([0-2][0-9]\)/\([0-9][0-9][0-9][0-9]\)|\3-\2-\1|g' 

, но когда я запускаю программу, я получаю эту ошибку:

"sed: -e выражение # 4, символ 62: недопустимая ссылка \ 3 в RHS команды `s '

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Не могли бы вы попробовать следующее.

echo "xxx 03/11/2018" |
awk  '
 match($0,/[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]/){
   if(RSTART!=1){
     val=substr($0,1,RSTART-1)
   }
   val=val substr($0,RSTART+6,4)"/"substr($0,RSTART+3,2)"/"substr($0,RSTART,2)
   print val substr($0,RSTART+RLENGTH)
}'

Объяснение: Добавление пояснения к приведенному выше коду сейчас.

echo "xxx 03/11/2018" |                                                               ##Using echo command for printing string and passing its output into awk command.
awk  '                                                                                ##Starting awk program here.
 match($0,/[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]/){                            ##Using match function for matching regex 2 digits / 2 digits / 4 digits.
   if(RSTART!=1){                                                                     ##Checking if RSTART is NOT equal to 1 then do following.
     val=substr($0,1,RSTART-1)                                                        ##Creating variable val whose value is substring from 1 to RSTART-1, RSTART and RLENGTH are variables which will be SET once a match of regex is found bymatch function of awk.
   }                                                                                  ##Closing block of if condition here.
   val=val substr($0,RSTART+6,4)"/"substr($0,RSTART+3,2)"/"substr($0,RSTART,2)        ##Creating variable val here as per OPs need YYYY/MM/DD by using substring and its index values changing.
   print val substr($0,RSTART+RLENGTH)                                                ##Printing value of variable val and substring from value of RSTART+RLENGTH to till end of line.
}'                                                                                    ##Closing block of match now.

Это будетзаботиться о до и после текста соответствующей даты тоже.Как и в примере выше, я добавил xxx, и он будет введен до даты, как показано ниже.

xxx 2018/11/03 


ИЛИ, если вы хотите напечатать другие строкивместе со строками YYYY/MM/DD, затем попробуйте выполнить следующие действия.

echo "xxx 03/11/2018" |
awk  '
 match($0,/[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]/){
   if(RSTART!=1){
     val=substr($0,1,RSTART-1)
   }
   val=val substr($0,RSTART+6,4)"/"substr($0,RSTART+3,2)"/"substr($0,RSTART,2)
   print val substr($0,RSTART+RLENGTH)
   next
}
1 '

ПРИМЕЧАНИЕ: Поскольку моя версия awk старая, поэтому яиспользуя match($0,/[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]/, но я считаю, что вы можете использовать match($0,/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/), если ваша awk - новая версия.

0 голосов
/ 17 февраля 2019

Эта ошибка обычно возникает, когда группа захвата не экранирована должным образом.

Тем не менее, в вашей команде экранированы парены для групп захвата, поэтому, возможно, вы пытались использовать ее с Расширенными регулярными выражениями флаг (sed -r или sed -E) на случай, если вам не нужно избегать его.

Обратите внимание, что для удобства чтения вы можете комбинировать диапазоны символов с числовым квантификатором:

sed -E "s|([0-9]{2})/([0-9]{2})/([0-9]{4})|\3-\2-\1|" file
0 голосов
/ 17 февраля 2019

Это из-за паренов, вам нужно добавить \, чтобы он работал как групповой перехват:

echo 03/11/2018|sed -e 's|\([0-9][0-9]\)/\([0-2][0-9]\)/\([0-9][0-9][0-9][0-9]\)|\3-\2-\1|g'
2018-11-03

В некоторых версиях sed, таких как GNU sed, вы можете добавить -E или -rпереключитесь, тогда экранирование изменится на противоположный:

echo 03/11/2018|sed -E 's|([0-9][0-9])/([0-2][0-9])/([0-9][0-9][0-9][0-9])|\3-\2-\1|g'
2018-11-03

По умолчанию вам нужно использовать \(....\), чтобы поймать вещи в группу, а () будет буквально совпадать с паренами.
С *Переключатель 1013 * или -r, однако, (...) для ловли групп и \(\) для буквального совпадения с паренами.
Кстати, {} аналогичны ситуации ().

...