Tengo este archivo:
sometext1{
string1
}
sometext2{
string2
string3
}
sometext3{
string4
string5
string6
}
Quiero buscar en este archivo una cadena específica e imprimir todo antes de esta cadena hasta la apertura {y todo después de esta cadena hasta el cierre }. Traté de lograr esto con sed, pero si trato de imprimir todo en el rango, /{/,/string2/por ejemplo, sed imprime esto:
sometext1{
string1
}
sometext2{
string2
sometext3{
string4
string5
string6
}
Si busco la cadena "string2", necesito que la salida sea:
sometext2{
string2
string3
}
Gracias.
text-processing
sed
rodrigo
fuente
fuente

grep -n '' <infile | sed .... Lossedcomandos deberán modificarse; específicamente los bits de/dirección/que buscan^anclajes de primera línea. Por lo tanto, si estuviera usando mi respuesta que probablemente se podría hacer:grep -n '' | sed 'H;/{$/h;/^[^:]*:}/x;/{\n.*PATTERN/!d'. Todas las líneas de salida tendrán como prefijo los números de línea del archivo original seguidos de dos puntos,1:sometext1{\n2:string1etc.sedfiltrará solo lo que filtraría antes, excepto que cada línea de salida se abre con un número.Respuestas:
Aquí hay dos comandos. Si desea un comando que recorta hasta la última
.*{$línea de una secuencia (como lo hace @don_crisstied) , puede hacer lo siguiente:... que funciona agregando cada línea al
Hespacio antiguo siguiendo un\ncarácter de línea de línea , sobrescribiendo elhespacio antiguo para cada línea que coincida{$e intercambiando loshespacios antiguos y de patrón para cada línea que coincida^}, y así vaciar su búfer.Sólo se imprime líneas que coincidan con una
{continuación de una\newline y luegoPATTERNen algún momento - y que sólo llega a suceder inmediatamente después de un intercambio de tampón.Elimina cualquier línea de una serie de
{$coincidencias hasta la última de la secuencia, pero puede obtener todas esas inclusivas como:Lo que hace es intercambiar el patrón y los
hespacios antiguos para cada...{$.*^}.*secuencia, agrega todas las líneas dentro de la secuencia alHespacio anterior siguiendo un\ncarácter de línea eyDelige el primer\ncarácter de línea ew en el espacio de patrón para cada ciclo de línea antes de comenzar de nuevo con lo que queda.Por supuesto, la única vez que obtiene
\newline en el espacio del patrón es cuando una línea de entrada coincide^}, el final de su rango, y cuando vuelve a ejecutar el script en cualquier otra ocasión, simplemente tira de la siguiente línea de entrada de forma habitual.Sin embargo, cuando
PATTERNse encuentra en el mismo espacio de patrón que un\newline, imprime el lote antes de sobrescribirlo^}nuevamente (para que pueda finalizar el rango y vaciar el búfer) .Dado este archivo de entrada (gracias don) :
Las primeras impresiones:
...y el segundo...
fuente
}. Esto podría ser beneficioso para ...open{\nsub;\n{ command; }\n}; close- pero no estoy seguro de que eso sea lo que está sucediendo aquí ...{...}bloques? Si ese es el caso y está usando la primera solución, puede hacerlo/{$/,/^}/Hal comienzo en lugar de soloH. Pero si también probaste la segunda solución y aún encontraste el mismo error, no es probable que te ayude porque esa ya lo hace. Y tampoco descartesed. don tiene una muy buena respuesta aquí, y tambiénedse puede aplicar para usar archivos temporales de búfer de manera muy simple, lo que debería evitar el desbordamiento del búfer de memoria.Aquí hay una solución con
ed:es decir:
Esto supone que solo hay una línea
PATTERNentre cada par, de lo{}contrario obtendrá una salida duplicada para cada línea adicionalPATTERNdentro del mismo bloque.Funcionará para múltiples que
{}contengan una sola línea coincidente,PATTERNpor ejemplo, para un archivo de prueba conPATTERNdos secciones diferentes:corriendo
salidas:
fuente
Con
pcregrep:O con GNU
grepsiempre que la entrada no contenga bytes NUL:fuente
dónde:
string4-> cadena para que coincidat1.txt-> contiene el contenido del archivo mencionado en la consultafuente
sed -n '/ string / p' nombre de archivo
el -n cuando se agrega al comportamiento predeterminado de sed suprimido sed, esta declaración podría no darle exactamente lo que desea, pero debería desplazar la cadena
fuente