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 ...
. Lossed
comandos 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:string1
etc.sed
filtrará 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
H
espacio antiguo siguiendo un\n
carácter de línea de línea , sobrescribiendo elh
espacio antiguo para cada línea que coincida{$
e intercambiando losh
espacios 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\n
ewline y luegoPATTERN
en 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
h
espacios antiguos para cada...{$.*^}.*
secuencia, agrega todas las líneas dentro de la secuencia alH
espacio anterior siguiendo un\n
carácter de línea eyD
elige el primer\n
cará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
\n
ewline 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
PATTERN
se encuentra en el mismo espacio de patrón que un\n
ewline, 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/{$/,/^}/H
al 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éned
se 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
PATTERN
entre cada par, de lo{
}
contrario obtendrá una salida duplicada para cada línea adicionalPATTERN
dentro del mismo bloque.Funcionará para múltiples que
{
}
contengan una sola línea coincidente,PATTERN
por ejemplo, para un archivo de prueba conPATTERN
dos secciones diferentes:corriendo
salidas:
fuente
Con
pcregrep
:O con GNU
grep
siempre 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