Задача SED, агрегирование строки, содержащей фигурные скобки

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

Пример:

#/!bin/bash text="Column One(TAB)(TAB)(TAB)Column Two(TAB)(TAB)Column three(TAB)Column4" modText=`echo $text | sed 's/([(]\{1\}TAB[)]\{1\})\{2,8\}/(TAB)/g'` 
  • Я пробовал несколько версий sed-команды, один из которых является одним из них. Моя оригинальная идея была modText = `echo $ text | sed 's / \ (TAB \) \ {1 \}) \ {2,8 \} / (TAB) / g'`

Было бы здорово, если бы вы могли мне помочь. Почувствовал, что решение не так далеко, но у меня больше нет идей, и мои исследования этого не сделали: -S


Пример текста

«Столбец один (TAB) (TAB) (TAB) Столбец второй (TAB) (TAB) Столбец три (TAB) Столбец4"

Мои критерии поиска будут сопоставляться с первыми двумя (TAB) группами, происходящими между «Столбец Один» и «Столбец три».

Результат будет выглядеть следующим образом:

«Столбец один (TAB) Столбец второй (TAB) Столбец три (TAB) Столбец4"

  • Разделить переменную на число?
  • Как узнать, существует ли каталог?
  • Установите переменные переменных переменных в bash (или другие)
  • Чтение .zshrc в X сеансе открыто? / Как выполнить скрипт в X сеансе открытия?
  • Как добавить несколько строк в файл с помощью bash, с символом «-» перед строкой
  • Извлечь текст между тремя одинарными кавычками
  • Как предотвратить отображение искаженного экрана во время запуска скриптов на удаленных хостах?
  • Откройте новое окно терминала gnome с тем же каталогом, что и предыдущее окно.
  • 2 Solutions collect form web for “Задача SED, агрегирование строки, содержащей фигурные скобки”

    Я не уверен, что понимаю, как должно применяться предложение «максимум 8», но наивный подход будет примерно таким:

     sed 's/\((TAB)\)\{2,8\}/(TAB)/g' 

    Если вы имеете в виду, что замена не должна выполняться, если имеется более 8 соседних (TAB) , вы можете сделать:

     sed ' s/_/_u/g; # escape _ s/|/_p/g; # escape | s/(TAB)/|/g; # use a single character in place of (TAB) s/.*/<&>/; # add leading and trailing non-| character s/\([^|]\)|\{2,8\}\([^|]\)/\1|\2/; # replace up to 8 | provided # they are not preceded nor followed # by | s/.\(.*\)./\1/; # undo wrapping s/|/(TAB)/g; # undo replacement s/_p/|/g;s/_u/_/g; # undo escaping' 

    Если ваш sed (например, ssed ) поддерживает perl-подобные ssed , вы можете использовать операторы look-around:

     ssed -R 's/(?<!\(TAB\))(\(TAB\)){2,8}(?!\(TAB\))/(TAB)/g' 

    Или используйте perl напрямую:

     perl -lpe 's/(?<!\(TAB\))(\(TAB\)){2,8}(?!\(TAB\))/(TAB)/g' 

    AT & T (ast-open) sed с опцией -A / -X поддерживает вид расширенных регулярных выражений, которые они называют дополненными, которые имеют оператор отрицания ( x! ) И оператор сопряжения ( x&y ). Там (.{5}&(\(TAB\))!) Соответствует последовательности из 5 символов, которая не является (TAB) . Таким образом, с этим sed вы можете сделать что-то вроде:

     sed -A ' :1 s/(^.{0,4}|.{5}&(\(TAB\))!)(\(TAB\)){2,8}(.{0,4}$|.{5}&(\(TAB\))!)/\1(TAB)\4/ t1' 
    Linux и Unix - лучшая ОС в мире.