Intereting Posts
Как скомпилировать linux-версию ядра 3.16.1 для запуска в Slackware 14.1? Как получить группу пользователей и их последний статус логина и пароля в gnu / linux или Unix vim / emacs для просмотра рекурсивных результатов поиска grep? Монетный двор 15, замороженный при запуске, не знает, почему Мостовая сеть OpenVPN без аутентификации AWK получает первую строку IPTABLES: обрабатывать пакет локально и отправлять копию другому хосту Что влияет изменение источника clocksource? Как добавить пользовательскую раскладку клавиатуры в Linux Mint Как остановить bash слишком умным ограничением вариантов завершения? В каком месте оболочка назначает нормальную переменную? Обработка ошибок скрипта: необходимо сообщить о сбое в скрипте, запущенном ssh Как отправить текст на USB-устройство? Среднее значение средней нагрузки: какие процессы ждут в очереди? ZFS Raid или Hardware Raid в FreeNAS

Как использовать multiline как group-separator в grep?

В grep вы можете использовать --group-separator чтобы писать что-то между групповыми совпадениями.

Это полезно, чтобы дать понять, какие блоки у нас есть, особенно при использовании опции -CX для получения контекстных строк.

 $ 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 

Я научился использовать пустую строку как контекст «group-separator» для grep, как просто иметь пустую строку, говоря --group-separator="" .

Однако, что, если я хочу иметь две пустые строки? Я попробовал сказать – --group-separator="\n\n" но я получаю литерал \n s:

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

Другие вещи, такие как --group-separator="\nhello\n" тоже не работали.

Ooooh Я нашел его, мне просто нужно использовать синтаксис $'' вместо $"" :

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

От man bash :

квотирование

Слова формы $ 'string' обрабатываются специально. Слово расширяется до строки с заменой символов с обратным слэшем, как указано в стандарте ANSI C. Последующие последовательности обратной косой черты, если они имеются, декодируются следующим образом:

 (...) \n new line 

Я предлагаю использовать echo -e или printf с \\n для новой строки.

Пример (с echo -e ):

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

Пример (с printf ):

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

Одно из преимуществ заключается в использовании двойной кавычки . (следовательно, переменное расширение и т. д.)