Решение:
perl -lape '$\=/,/?"":"\n"' list.txt
Пояснение:
Устанавливает разделитель выходных записей $\
на пустую строку ""
, если строка содержит запятую; сбрасывает его на \n
, в противном случае (разделитель выходных записей — это то, что отделяет одну строку от другой в выходных данных; в Unix это обычно перевод строки ). Эквивалент более длинного и легко читаемого:
perl -lape '(/,/) ? ($\="") : ($\="\n")' list.txt
или аналогично:
perl -lape 'if (/,/) {$\=""} else {$\="\n"}' list.txt
Комментарии:
Причина, по которой sed
не делает того, что ожидал OP, заключается в том, что он удаляет разделитель записей перед работой со строкой и возвращает его после этого. Разделителем записей по умолчанию является "\n"
, для замены не найдено "\n"
. Я выбрал perl
, потому что знаю, что разделитель записей представлен как специальная переменная, которой можно явно манипулировать.
Мое решение основано на размещенном входном образце и желаемом результате. Я не думаю, что это отвечает на вопрос в заголовке:Замените запятую на новую строку, следующую только за командой и пробелом . Я читал это много раз, но эти слова просто не образуют для меня значимой последовательности.
Изменить -более простое решение:
perl -pe 's/,\n/,/' list.txt
Это то, что я предложил в комментариях, и я подумал, что также добавлю это к ответу. Несмотря на то, что он краткий и непосредственный, какой смысл использовать perl
, если вы не можете продемонстрировать какую-нибудь маленькую -известную специальную переменную и неясный синтаксис?;-P
после некоторой отладки драйверов ядра ядра ядра PCM и соответствующего контроллера sdma, который использует ядро dma ядра pcm, я обнаружил, что передача DMA между контроллером DMA (/drivers/dma/imx -sdma.c )и SAI FIFO (/sound/soc/fsl/fsl _sai.c )останавливались, когда количество каналов было 16 и ширина канала 32 бита. Размер буфера DMA, указанный в файле asound.conf, также имеет значение.
Обработчик прерываний контроллера Sdma — это тот, который увеличивает значение HW.ptr, упомянутое в моем вопросе выше. Обработчик прерывания SDMA запускает таймер, созданный пользовательским пространством alsa, и пользовательское пространство ожидает этого таймера в функции опроса (, здесь он застрял ), чтобы его очистить, чтобы он знал, сколько буферов для записи в отображаемый буфер памяти dma.
Поскольку обработчик прерывания dma никогда не срабатывал, HW.ptr никогда не обновлялся, и обработчик прерывания таймера также никогда не срабатывал, что приводило к тому, что пользовательское пространство ждало в функции опроса и никогда не возвращалось.
Возможно, это не окончательное решение, но в зависимости от отдельных ситуаций решением может быть либо исправление в микропрограмме/сценарии контроллера dma, либо способ работы периферийных FIFO, подключенных к контроллеру dma. в любом случае необходимо понимание базовой реализации HW IP на данном процессоре.