Задача 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"

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' 
  • Невозможно войти в centOS с любым пользователем
  • Аргу слишком длинная ошибка при использовании find
  • Как отлаживать скрипты csh?
  • Удалите тишину из аудиофайлов, оставляя пробелы
  • В чем разница между запуском «bash script.sh» и «./script.sh»?
  • Измените существующий скрипт, чтобы хранить данные только две недели
  • Поиск файлов, содержащих символы, отличные от ASCII
  • Назначение команды массиву в сценарии оболочки не работает?
  • Как найти частоту появления строк, содержащихся в файле?
  • Импорт параметров переменных среды с другого сервера
  • Почему мой сценарий оболочки задыхается от пробелов или других специальных символов?
  • Замена значений в одном файле значениями в другом файле в bash
  • Linux и Unix - лучшая ОС в мире.