WedX - журнал о программировании и компьютерных науках

Как я могу использовать SED для замены определенного символа в подстроке

Итак, у меня есть файл csv с несколькими строками, например

"ABC-DEF-d98263","12345678","176568981","","588","ABC-DEF-11947","","GAUZE PACKING STRIPS 1/4"","","","2019-02-04T19:09:00-05:00","","XXX","XXX","2019-02-12T23:57:48-06:00","XXX-XXX-176568981"
"ABC-DEF-d1494751","98765432","98765432","1073552394","284","ABC-DEF-77997","","ACE WRAP 3"","","","2015-10-29T18:45:00-07:00","Sent","XXX","XXX","2018-04-05T19:38:41-05:00","XXX-XXX-76954940"

Я хотел бы заменить "", на ", только для столбца 8 или там, где он стоит после GAUZE PACKING STRIPS 1/4 или ACE WRAP 3, не касаясь других "", в строке.

Пробовал sed 's/[[:alnum:]]""//g' file.csv, но он также удаляет <num>"".

Есть идеи? Очень признателен!

19.10.2019

  • Похоже, что кавычки, с которыми у вас возникли проблемы, на самом деле обозначают дюймы (3/4" и 3"). Вы можете взглянуть на stackoverflow.com/questions/17808511, прежде чем идти по пути, предложенному в вашем вопросе. 19.10.2019

Ответы:


1

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

Регулярное выражение для сопоставления будет выглядеть примерно так: ("[^",]*")". Обратите внимание на две вещи: во-первых, " сопоставляются буквально, а выражение в середине [^",]* просто означает, что регулярное выражение будет соответствовать чему угодно, кроме " или ,. Это означает, что совпадающая строка не будет содержать кавычки внутри.

Наконец, круглые скобки представляют собой группу захвата, и мы можем ссылаться на все, что соответствует подрегулярному выражению между () с обратной косой чертой и числом. Например, \1 будет заменено на совпадение первой группы захвата, \3 — третьей и так далее.

Сценарий sed для того, что вам нужно, может выглядеть примерно так:

sed -re 's/("[^",]*")"/\1/g'

Посмотрите, как последняя двойная кавычка находится вне группы захвата, и она не будет заменена на \1.

Группы захвата — это функция расширенных регулярных выражений (ERE), поэтому для их включения в sed необходим флаг -r, иначе будут использоваться базовые регулярные выражения (BRE).

Обратите также внимание на /g в конце. Это необходимо для того, чтобы sed мог сопоставлять и заменять более одного вхождения в одной строке.

Пример:

$ cat test
"ABC-DEF-d98263","12345678","176568981","","588","ABC-DEF-11947","","GAUZE PACKING STRIPS 1/4"","","","2019-02-04T19:09:00-05:00",""","XXX","XXX","2019-02-12T23:57:48-06:00"","XXX-XXX-176568981"
$ cat test | sed -re 's/("[^",]*")"/\1/g'
"ABC-DEF-d98263","12345678","176568981","","588","ABC-DEF-11947","","GAUZE PACKING STRIPS 1/4","","","2019-02-04T19:09:00-05:00","","XXX","XXX","2019-02-12T23:57:48-06:00","XXX-XXX-176568981"
19.10.2019
  • Этот работал очень хорошо! Спасибо :) Так как я работал с большим количеством файлов, я добавил дополнительный параметр, чтобы он молчал и вносил изменения в файл. sed -i -re 's/("[^",]*")"/\1/g' file.csv 21.10.2019

  • 2

    Используя авк:

    $ awk '
    BEGIN { FS=OFS="," }           # set delimiters
    {
        if($8!="\"\"")             # if $8 is not empty ie. ""
            sub(/\"\"$/,"\"",$8)   # replace trailing double quotes with a single double quote
    }1' file                       # output
    

    Выход:

    "ABC-DEF-d98263","12345678","176568981","","588","ABC-DEF-11947","","GAUZE PACKING STRIPS 1/4","","","2019-02-04T19:09:00-05:00","","XXX","XXX","2019-02-12T23:57:48-06:00","XXX-XXX-176568981"
    "ABC-DEF-d1494751","98765432","98765432","1073552394","284","ABC-DEF-77997","","ACE WRAP 3","","","2015-10-29T18:45:00-07:00","Sent","XXX","XXX","2018-04-05T19:38:41-05:00","XXX-XXX-76954940"
    
    19.10.2019
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]