Как я могу заставить sed удалить строку, а затем проигнорировать проверку файла?

1

Я использую следующую команду для извлечения описаний из патчей:

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

Как я могу избавиться от egrep -v '^(diff|---)' часть и использовать только сед? Я пытался сделать это:

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

Но как только эта «d» достигнута, «q» пропускается, а остальные строки в теле патча печатаются. Вот пример патча:

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;

Сценарий sed должен возвращать все, что находится выше строки, начинающейся с «diff;» вот что должно быть на выходе:

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
источник
@ John1024, я добавил образец патча.
Eric Pruitt

Ответы:

0

вернуть все, что выше строки, начинающейся с «diff;»

Используя sed

В этом случае попробуйте:

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

Выше удаляет все строки из первой, которая соответствует регулярному выражению ^diff до последней строки, $,

Несколько более эффективная версия выходит, когда строка, содержащая ^diff достигается:

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

Используя ваш пример файла:

$ 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",
    };

Использование awk

Использование awk:

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

1 является загадочным сокращением awk для print-the-line. Однако, когда первая строка соответствует регулярному выражению ^diff достигнута, программа завершена.

$ 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
источник
1
Спасибо, это работает. Я на самом деле доволен awk, но я хочу стать лучше с sed, и мне также легче писать переносимые сценарии sed, чем переносимые сценарии awk, вероятно потому, что я был избалован многочисленными полезными расширениями, в то время как я редко нахожу себя жажду новых функций, когда я использую sed. В этом случае размещенный вами скрипт awk идеально переносим, ​​но размещенный мною скрипт sed - это сокращенная версия того, что я на самом деле использую.
Eric Pruitt