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


1

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

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

Як я можу позбутися egrep -v '^(diff|---)'частини і використовувати тільки sed? Я спробував це зробити:

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

@ John1024, я додав зразок виправлення.
Ерік Прутт

Відповіді:


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 для роздруківки на лінії. Однак, коли буде досягнуто першого рядка, що відповідає регексу ^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",
    };

1
Дякую, це працює. Мені справді комфортно з awk, але я хочу поправитись з sed, і мені також легше писати портативні сценарії sed, ніж портативні сценарії awk, ймовірно, тому, що мене зіпсували численні корисні розширення, тоді як я рідко знаходжу себе прагну до нових функцій, коли я використовую sed. У цьому випадку сценарій awk, який ви опублікували, є ідеальним портативним, але сценарій sed, який я розмістив, - це скорочена версія того, що я насправді використовую.
Ерік Прутт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.