Как добавить после Regex Search в Perl скрипт - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь преобразовать дамп MySQL в базу данных SQLite для миграции базы данных.Мне нужно отредактировать дату, чтобы добавить время, поэтому, например, 2018-09-19 следует преобразовать в 2018-09-19 00: 00: 00.00.Причина этого формата связана с тем, как работает наше приложение.Это решение, которое я придумал, но оно не работает.

#!/usr/bin/perl
while (<>){
  <Other Stuff>
  ....
  s/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))\[/$1[00:00:00.00]][/
print;
}

Для тестирования я создал файл test.txt только для тестирования

2019-03-06

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

 perl -pe  's/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))\[/$1[00:00:00.00]][/' < test.txt > testout.txt

Это дает явную ошибку:

syntax error at -e line 1, near "00:" Execution of -e aborted due to compilation errors.

Использование этого решения @ dada, которое выглядит так, не даетошибка, но также не добавляет 00: 00: 00.00 в конце строки

Ожидаемый результат должен быть

2019-03-06 00:00:00.00

1 Ответ

0 голосов
/ 23 марта 2019

В вашем заявлении о проблеме сказано, что вы хотите повернуть:

2018-09-19

в

2018-09-19 00:00:00.00

Тем не менее, ваш код:

s/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))\[/$1[00:00:00.00]][/

Используя /x, мы можем написать это более разборчиво, как:

s/
    (
        [12]\d{3}                    # year
        -                            # hyphen
        ( 0[1-9] | 1[0-2] )          # month (saved as $2)
        -                            # hyphen
        ( 0[1-9] | [12]\d | 3[01] )  # day (saved as $3)
    )                                # save this as $1
    \[                               # square bracket 
/$1[00:00:00.00]][/x

Из этого ясно, что 2018-09-19 не совпадает, поскольку не заканчивается квадратной скобкой.

Значение замены:

$1[00:00:00.00]][

Это (пытается) сказать:

  • индекс поиска 00:00:00.00 в массиве @1 и подставляемое значение
  • приложение ][

Однако это неверный perl и не то, что вы хотели.

Происходит следующее: вместо $x + [y] (скаляр, за которым следует строковое значение), perl видит $x[y] (значение из массива). Чтобы предотвратить это, используйте скобки (${x}[y]) или избегайте скобок ($x\[y]). Это приводит к:

${1}[00:00:00.00]][

, что по-прежнему не соответствует требованию проблемы, поскольку нули заключены в квадратные скобки.

Чтобы получить то, что, как вы говорите, хотите, удалите \[ с конца поисковой части и удалите ненужные скобки с запасной части:

s/
    (
        [12]\d{3}
        - ( 0[1-9] | 1[0-2] )
        - ( 0[1-9] | [12]\d | 3[01] )
    )
    # no bracket here
/$1 00:00:00.00/x;  # no brackets here

Обратите внимание, что в вашем коде есть еще одна ошибка, заключающаяся в том, что конечный print должен быть отделен от s/// точкой с запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...