grep에서 여러 줄을 그룹 구분 기호로 사용하는 방법은 무엇입니까?

grep에서 여러 줄을 그룹 구분 기호로 사용하는 방법은 무엇입니까?

그룹 게임 사이에 무언가를 쓸 수 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"작동하지 않습니다.

답변1

$''아 찾았습니다. 대신 구문을 사용해야 했습니다 $"".

$ 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

답변2

나는 사용하는 것이 좋습니다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

한 가지 장점은 우리가 사용하고 있다는 것입니다.큰따옴표. (그래서 가변 확장 등이 작동합니다)

관련 정보