SED删除字符的两个实例之间的所有内容

时间:2020-03-10 11:55:00

标签: mysql linux sed vi

我有一个带appr的数据库转储。 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}

“带很多字符的字符串”是大约600.000个字符的字符串(!)

我需要删除每行上的那些字符...我尝试过:

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

但似乎并没有解决问题。

我也找不到在这里使用的答案,因此与您联系,希望您可以帮助我..用SED最好做到这一点吗?或其他任何方法?

目前,我不在乎是否删除或替换了“ STRING WITH CHARACTERS”上的所有字符。 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 :(得分:0)

当我对您提供的示例文本执行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)-例如:Escaping double quotation marks in sed(但不幸的是,我没有还没有解决,我必须立即退出)

此答案说明了为什么会发生这种情况,并在您可能的情况下采取了一些补救措施:Unknown UTF-8 code units closing double quotes

答案 1 :(得分:0)

如果您使用的是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}