Как использовать многострочный как разделитель групп в grep?


9

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

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

$ 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

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

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

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

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

Ответы:


12

Оооо, я нашел это, мне просто нужно использовать $''синтаксис вместо $"":

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



something else
hello hello
bye

От man bash:

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

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

(...)
\n     new line

1

Я предлагаю использовать 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

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


Я не думаю, что это необходимо использовать printfили echo. В вашем случае grep -C1 --group-separator=$'hello\nfedorqui' 'hello' aэто эквивалентно.
Федорки

@fedorqui да, позвольте мне удалить мой лишний ответ!
Пандья

Тем не менее, спасибо за усилия, если бы я не нашел $''ваш, это был бы хороший путь!
Федорки

@fedorqui Кстати, я обнаружил ошибку с $'$var'(невозможно развернуть / напечатать значение переменной, если оно задано одинарной кавычкой!) тогда как "$(echo $var)"может работать.
Пандья

Да, это правильно. Но вы можете сказать $'"$var"'. Это $'+ "$var"+ '.
Федорки
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.