Desafío SED, agregando cadenas que contienen llaves

He estado tratando de usar sed para agregar un patrón de cadena específico dentro de un text durante horas, pero no puedo encontrar la solución. ¡Espero que sepan cómo hacerlo !?

Ejemplo:

#/!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'` 
  • He probado varias versiones del command sed, la de arriba es solo una de ellas. Mi idea original fue modText = `echo $ text | sed 's / \ (TAB \) \ {1 \}) \ {2,8 \} / (TAB) / g'`

Sería genial si pudieras ayudarme. Tengo la sensación de que la solución no está tan lejos, pero simplemente no tengo más ideas y mi investigación no lo hizo: -S


Ejemplo de text

"Columna uno (TAB) (TAB) (TAB) Columna dos (TAB) (TAB) Columna tres (TAB) Columna4"

Mis dos criterios de búsqueda se corresponden con los primeros dos (TAB) Grupos, que se producen entre "Columna Uno" y "Columna tres".

El resultado se verá así:

Columna uno (TAB) Columna dos (TAB) Columna tres (TAB) Columna4 "

No estoy seguro de entender cómo se supone que se aplica la cláusula de "máximo 8", pero el enfoque ingenuo sería algo como esto:

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

Si quiere decir que el reemploop no debería hacerse si hay más de 8 adyacentes (TAB) s, podría hacer lo siguiente:

 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' 

Si su sed (como ssed ) admite expresiones regulares parecidas a perl, puede usar operadores de búsqueda:

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

O usa perl directamente:

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

AT & T (ast-open) sed , con la opción -A / -X admite un tipo de expresiones regulares extendidas que llaman aumentadas que tienen un operador de negación ( x! ) Y un operador de conjunción ( x&y ). Allí, (.{5}&(\(TAB\))!) Coincide con una secuencia de 5 caracteres que no es (TAB) . Entonces con ese sed , puedes hacer algo como:

 sed -A ' :1 s/(^.{0,4}|.{5}&(\(TAB\))!)(\(TAB\)){2,8}(.{0,4}$|.{5}&(\(TAB\))!)/\1(TAB)\4/ t1'