замена вложенных обратных ссылок в регулярном выражении - PullRequest
0 голосов
/ 27 февраля 2019

Я извлек столбец из электронной таблицы Excel, где некоторые ячейки содержат несколько строк, а некоторые нет.Многорядные ячейки разделены кавычками.Я хочу заменить возврат в этих многорядных ячейках на ",".Итак, мой файл выглядит примерно так:

"Alpha
 Beta
 Gamma"
 123
 456
"Apple
 Banana
 Cherry"
 789
 this is a single-line cell

Моя цель

 Alpha, Beta, Gamma
 123
 456
 Apple, Banana, Cherry
 789
 this is a single-line cell

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

"(([^"]+)\n)+([^"]+)"

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Попробуйте:

$ sed '/^"/{:a; /"$/bb; N; ba; :b; s/\n//g}' file
"Alpha Beta Gamma"
 123
 456
"Apple Banana Cherry"
 789
 this is a single-line cell

Как это работает

  • /^"/{...}

    Для любых строк, начинающихся с ", командыв фигурные скобки будут выполняться.

  • :a

    Это создает метку a.

  • /"$/bb

    Если текущее пространство шаблона заканчивается на ", тогда переходите к метке b.

  • N

    Считайте aновая строка в пространство шаблона.

  • ba

    Ответвление обратно на метку a.

  • :b

    Это определяет метку b.

  • s/\n//g

    Удалите все символы новой строки из пространства шаблона.

0 голосов
/ 27 февраля 2019

С GNU awk для мульти-символьных RS и RT:

$ awk -v RS='"[^"]+"|[^"\n]+' '$0=RT{gsub(/^\s+|\s+$|"/,""); gsub(/\n/,","); print}' file
Alpha, Beta, Gamma
123
456
Apple, Banana, Cherry
789
this is a single-line cell
...