САС удалить все между 2 экземплярами персонажа - PullRequest
0 голосов
/ 10 марта 2020

У меня есть база данных с ок. 6,0000 строк. Все они выглядят так:

{"student”:”12345”,”achieved_date":1576018800,"expiration_date":1648677600,"course_code”:”SOMECODE,”certificate”:”STRING WITH A LOT OF CHARACTERS”,”certificate_code”:”ABCDE,”certificate_date":1546297200}

"STRING WITH LOT OF CHARACTERS" - строка длиной около 600 000 символов (!)

Мне нужно, чтобы эти символы в каждой строке были удалены ... Я пытался с:

sed 's/certificate\":\"*","certificate_code//'

Но, похоже, это не сработало.

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

На данный момент мне все равно, будут ли все символы в «STRING WITH A LOT OF CHARACTERS» удалены или заменены IE на 0, даже если это сделает его работоспособным для меня; )

Вывод для od -xc filename | head:

0000000    2d2d    4d20    5379    4c51    6420    6d75    2070    3031
          -   -       M   y   S   Q   L       d   u   m   p       1   0
0000020    312e    2033    4420    7369    7274    6269    3520    372e
          .   1   3           D   i   s   t   r   i   b       5   .   7
0000040    322e    2c39    6620    726f    4c20    6e69    7875    2820
          .   2   9   ,       f   o   r       L   i   n   u   x       (
0000060    3878    5f36    3436    0a29    2d2d    2d0a    202d    6f48
          x   8   6   _   6   4   )  \n   -   -  \n   -   -       H   o
0000100    7473    203a    3231    2e37    2e30    2e30    2031    2020
          s   t   :       1   2   7   .   0   .   0   .   1

надеюсь, вы мне поможете!

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Если вы работаете с bash, попробуйте следующее:

q=$'\xe2\x80\x9d'
sed "s/certificate${q}:${q}.*${q},${q}certificate_code//" file

Результат:

{"student”:”12345”,”achieved_date":1576018800,"expiration_date":1648677600,"course_code”:”SOMECODE,””:”ABCDE,”certificate_date":1546297200}
0 голосов
/ 10 марта 2020

Когда я выполняю команду od для предоставленного вами образца текста, вывод включает в себя:

0000520      454d    4f43    4544    e22c    9d80    6563    7472    6669
           M   E   C   O   D   E   ,   ”  **  **   c   e   r   t   i   f
0000540      6369    7461    e265    9d80    e23a    9d80    5453    4952
           i   c   a   t   e   ”  **  **   :   ”  **  **   S   T   R   I
0000560      474e    5720    5449    2048    2041    4f4c    2054    464f
           N   G       W   I   T   H       A       L   O   T       O   F
0000600      4320    4148    4152    5443    5245    e253    9d80    e22c
               C   H   A   R   A   C   T   E   R   S   ”  **  **   ,   ”
0000620      9d80    6563    7472    6669    6369    7461    5f65    6f63
          **  **   c   e   r   t   i   f   i   c   a   t   e   _   c   o
0000640      6564    80e2    3a9d    80e2    419d    4342    4544    e22c
           d   e   ”  **  **   :   ”  **  **   A   B   C   D   E   ,   ”

Таким образом, вы можете видеть, что «кавычки» - это последовательности байтов e2 80 9d, которые Unicode U + 201d (см. https://www.utf8-chartable.de/unicode-utf8-table.pl?start=8192&number=128)

Вероятно, проще всего было бы просто пропустить эти символы Unicode с подстановочным знаком из одного символа .

sed "s/certificate.:.*.certificate_code/certificate_code/"

К сожалению, sed, похоже, не принимает синтаксис unicode \u201d, поэтому некоторые другие ответы предлагают использовать шестнадцатеричную последовательность (\xe2\x80\x9d) - например: Экранирование двойных кавычек в sed (но, к сожалению, у меня нет пока что это не сработало, и я должен подписать сейчас)

Этот ответ объясняет, почему это могло произойти, с некоторыми корректирующими действиями, если это возможно в вашей ситуации: Неизвестный UTF-8 кодовые единицы, закрывающие двойные кавычки

...