¿Cómo usar multilínea como separador de grupos en grep?

8

En grepella puedes usar --group-separatorpara escribir algo en el medio partidos de grupo.

Esto es útil para dejar en claro qué bloques tenemos, especialmente cuando usamos la -C Xopción para obtener líneas de contexto.

$ cat a
hello
this is me
and this is
something else
hello hello
bye
i am done
$ grep -C1 --group-separator="+++++++++" 'hello' a
hello
this is me
+++++++++
something else
hello hello
bye

Aprendí en Usar línea vacía como contexto "separador de grupos" para grep cómo tener una línea vacía, diciendo --group-separator="".

Sin embargo, ¿qué pasa si quiero tener dos líneas vacías? Traté de decir --group-separator="\n\n"pero obtengo \ns literal :

$ grep -C1 --group-separator="\n\n" 'hello' a
hello
this is me
\n\n
something else
hello hello
bye

Otras cosas como --group-separator="\nhello\n"tampoco funcionaron.

fedorqui
fuente

Respuestas:

12

Ooooh lo encontré, solo necesito usar la $''sintaxis en lugar de $"":

$ grep -C1 --group-separator=$'\n\n' 'hello' a
hello
this is me



something else
hello hello
bye

De man bash:

CITA

Las palabras de la forma $ 'string' se tratan especialmente. La palabra se expande a cadena, con caracteres de barra invertida reemplazados según lo especificado por el estándar ANSI C. Las secuencias de escape de barra invertida, si están presentes, se decodifican de la siguiente manera:

(...)
\n     new line
fedorqui
fuente
1

Sugiero usar echo -eo printfcon \\nnew-line.

Ejemplo (con echo -e):

$ grep -C1 --group-separator="$(echo -e line1\\n\\nline2)" 'hello' a
hello
this is me
line1
line2
something else
hello hello
bye

Ejemplo (con printf):

$ grep -C1 --group-separator="$(printf hello\\nfedorqui)" 'hello' a
hello
this is me
hello

fedorqui
something else
hello hello
bye

Una ventaja es que estamos usando comillas dobles . (por lo tanto, expansión variable, etc. trabajo)

Pandya
fuente
No creo que sea necesario usar printfo echo. En tu caso, grep -C1 --group-separator=$'hello\nfedorqui' 'hello' aes equivalente.
fedorqui
@fedorqui sí, ¡déjame borrar mi respuesta redundante!
Pandya
¡Sin embargo, gracias por el esfuerzo, si no hubiera encontrado el $''suyo, sería la mejor manera de hacerlo!
fedorqui
@fedorqui Por cierto, encontré un error con $'$var'(¡incapaz de expandir / imprimir el valor de la variable si se establece entre comillas simples!) ¿verdad? mientras que "$(echo $var)"puede funcionar.
Pandya
Si, esto es correcto. Pero entonces puedes decir $'"$var"'. Eso es $'+ "$var"+ '.
fedorqui