¿Cómo puedo hacer que se elimine una línea y luego ignorar la prueba del archivo?

1

Estoy usando el siguiente comando para extraer descripciones de parches:

sed '
    s/Title: \(.*\)/### \1 ###\n\n**File:** FILE_NAME_HERE/
    /^diff\|^---/ {
        q
    }
' "$patch" | egrep -v '^(diff|---)'

¿Cómo puedo deshacerme de la egrep -v '^(diff|---)' parte y solo uso sed? Intenté hacer esto:

/^diff\|^---/ {
    d # <-- This is what I added
    q
}

Pero una vez que se alcanza la "d", la "q" se omite y el resto de las líneas en el cuerpo del parche se imprimen. Aquí hay un parche de muestra:

Title: Font Array Support

Modifies st to support user-defined fallback fonts specified in an array
defined as `static const char *fonts[]`. This change also resolves an issue
where fallback fonts were used in place of default fonts in an inconsistent
manner which caused identical sets of text to sometimes use different fonts. In
the following example, DejaVu Sans Mono is the primary font with two others
specified as fallbacks:

    static const char *fonts[] = {
        "DejaVu Sans Mono",
        "VL Gothic",
        "WenQuanYi Micro Hei",
    };

diff --git a/st.c b/st.c
index 2594c65..f7973bd 100644
--- a/st.c
+++ b/st.c
@@ -353,10 +353,17 @@ typedef struct {
    FcPattern *pattern;
 } Font;

El script sed debe devolver todo lo que está arriba de la línea que comienza con "diff"; esto es lo que debería ser la salida:

Title: Font Array Support

Modifies st to support user-defined fallback fonts specified in an array
defined as `static const char *fonts[]`. This change also resolves an issue
where fallback fonts were used in place of default fonts in an inconsistent
manner which caused identical sets of text to sometimes use different fonts. In
the following example, DejaVu Sans Mono is the primary font with two others
specified as fallbacks:

    static const char *fonts[] = {
        "DejaVu Sans Mono",
        "VL Gothic",
        "WenQuanYi Micro Hei",
    };
Eric Pruitt
fuente
@ John1024, he añadido un parche de muestra.
Eric Pruitt

Respuestas:

0

devuelve todo por encima de la línea que comienza con "diff";

Usando sed

En ese caso, intente:

sed '/^diff/,$d' a.patch

Lo anterior elimina todas las líneas de la primera que coincide con la expresión regular ^diff hasta la última línea, $.

Una versión ligeramente más eficiente sale cuando la línea que contiene ^diff es alcanzado:

sed -n '/^diff/q; p' a.patch

Usando su archivo de muestra:

$ sed -n '/^diff/q; p' a.patch
Title: Font Array Support

Modifies st to support user-defined fallback fonts specified in an array
defined as `static const char *fonts[]`. This change also resolves an issue
where fallback fonts were used in place of default fonts in an inconsistent
manner which caused identical sets of text to sometimes use different fonts. In
the following example, DejaVu Sans Mono is the primary font with two others
specified as fallbacks:

    static const char *fonts[] = {
        "DejaVu Sans Mono",
        "VL Gothic",
        "WenQuanYi Micro Hei",
    };

Utilizando awk

Utilizando awk:

awk '/^diff/{exit} 1' a.patch

los 1 es la taquigrafía críptica de awk para print-the-line. Sin embargo, cuando la primera línea que coincide con la expresión regular ^diff Se alcanza, el programa sale.

$ awk '/^diff/{exit} 1' a.patch
Title: Font Array Support

Modifies st to support user-defined fallback fonts specified in an array
defined as `static const char *fonts[]`. This change also resolves an issue
where fallback fonts were used in place of default fonts in an inconsistent
manner which caused identical sets of text to sometimes use different fonts. In
the following example, DejaVu Sans Mono is the primary font with two others
specified as fallbacks:

    static const char *fonts[] = {
        "DejaVu Sans Mono",
        "VL Gothic",
        "WenQuanYi Micro Hei",
    };
John1024
fuente
1
Gracias, eso funciona. En realidad me siento cómodo con awk, pero quiero mejorar con sed, y también me resulta más fácil escribir scripts sed portátiles que los awk scripts portátiles probablemente porque me han echado a perder numerosas y útiles extensiones que no me gustan Anhelo de nuevas características cuando uso sed. En este caso, el script awk que usted publicó es portátil perfecto, pero el script sed que publiqué es una versión abreviada de lo que realmente estoy usando.
Eric Pruitt