Arhn - архитектура программирования

Определить и заменить выборочное пространство внутри данного текстового файла

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

Содержимое файла

my data "this is my very first encounter with sed"  "valuable" - - "c l e a r"

Используется шаблон с использованием sed для замены пробела на, - Patten - 's / /, / g'

Фактический выход

my,data,"this,is,my,very,first,encounter,with,sed",,"valuable",-,-,"c,l,e,a,r"

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

my,data,"this is my very first encounter with sed",,"valuable",-,-,"c l e a r"
sed
26.07.2020

  • Хотя в sed это возможно, не делайте этого. Напишите правильный анализатор CSV на другом, более простом языке программирования. 26.07.2020

Ответы:


1

Следующий сценарий sed с комментариями с вводом из bash здесь строка:

<<<'my data "this is my very first encounter with sed"  "valuable" - - "c l e a r"' sed -E '
    # Split input with each character on its own line
    s/./&\n/g;
    # Add a newline on the end to separate output from input
    s/$/\n/;
    # Each line has one character
    # Add a leading character that stores "state"
    # There are two states available - in quoting or not in quoting
    # The state character is space when we are not in quotes
    # The state character is double quote when we are in quotes
    s/^/ /;
    # For each character in input
    :again; {
        # Substitute a space that is not in quotes for a comma
        s/^  / ,/

        # When quotes is encountered and we are not in quotes
        /^ "/{
            # Change state to quotes
            s//""/
            b removed_quotes
        } ; {
            # When quotes is encountered and we are in quotes
            # then we are no longer in quotes
            s/^""/ "/
        } ; : removed_quotes

        # Preserve state as the first character
        # Add the parsed character to the output on the end
        # Preserve the rest
        s/^(.)(.)\n(.*)/\1\3\2/;
        # If end of input was not reached, then parse another character.
        /^.\n/!b again;
    };
    # Remove the leading state character with the newline
    s///;
'

выходы:

my,data,"this is my very first encounter with sed",,"valuable",-,-,"c l e a r"

И один лайнер, потому что кто читает эти комментарии:

sed -E 's/./&\n/g;s/$/\n/;s/^/ /;:a;s/^  / ,/;/^ "/{s//""/;bq;};s/^""/ "/;:q;s/^(.)(.)\n(.*)/\1\3\2/;/^.\n/!ba;s///'

Я думаю, что новая строка \n в строке замены команды s - это расширение, которое не требуется posix. Другой уникальный символ может использоваться вместо новой строки для разделения ввода во время синтаксического анализа. Во всяком случае, я тестировал это с помощью GNU sed.

26.07.2020
  • wrt I think a newline ... - единственные 2 sed'а с -E arg - это GNU и OSX / BSD, первый будет работать с \n, второй - нет, так что да, это только GNU sed. Почти наверняка там есть и другие GNU-измы. 26.07.2020

  • 2

    Как упоминалось в комментариях, это лучше подходит для реального парсера CSV, вместо того, чтобы пытаться что-то накапливать, используя регулярные выражения - особенно довольно простые регулярные выражения sed.

    Однострочный perl с использованием полезного модуля Text :: AutoCSV (устанавливается через вашу ОС менеджер пакетов или любимый клиент CPAN):

    $ perl -MText::AutoCSV -e 'Text::AutoCSV->new(sep_char=>" ", out_sep_char=>",")->write' < input.txt
    my,data,"this is my very first encounter with sed",,valuable,-,-,"c l e a r"
    
    26.07.2020

    3

    С GNU awk для FPAT:

    $ awk -v FPAT='[^ ]*|"[^"]+"' -v OFS=',' '{$1=$1} 1' file
    my,data,"this is my very first encounter with sed",,"valuable",-,-,"c l e a r"
    

    Ваш ввод - это CSV, где C в этом случае означает символ вместо традиционной запятой, а рассматриваемый символ является пустым, и вы просто пытаетесь преобразовать его в CSV с разделителями-запятыми. См. Какой самый надежный способ эффективного синтаксического анализа CSV с помощью awk? для получения дополнительной информации о том, что делает вышеперечисленное, и о синтаксическом анализе CSV с awk в целом.

    26.07.2020

    4
    awk 'BEGIN {RS=ORS="\""} NR%2 {gsub(" ",",")} {print}' file
    
    • Вначале установите двойные кавычки в качестве разделителя записей.
    • Для нечетных записей, то есть вне кавычек, замените глобально любой пробел запятой.
    • распечатать каждую запись.
    27.07.2020

    5

    Это может сработать для вас (GNU sed):

    sed -E ':a;s/^((("[^"]*")*[^" ]*)*) /\1,/;ta' file
    

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

    28.07.2020
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..