grep -o를 사용하여 한 줄에 여러 일치 항목을 검색하고 인쇄하는 방법은 무엇입니까?

grep -o를 사용하여 한 줄에 여러 일치 항목을 검색하고 인쇄하는 방법은 무엇입니까?

mkdocs 인스턴스가 있고 페이지의 내부 링크를 인쇄하는 스크립트를 작성 중입니다. 한 줄에 여러 개의 일치 항목이 있는 경우 grep에서 일치 항목만 인쇄할 수 없습니다.

이것이 내가 현재 가지고 있는 것입니다:

$ grep -Eon '\[([[:alpha:]]|[[:digit:]]|[[:space:]])*\]\((\/|\.).*\)' /path/to/file.md
10:[foo](../../relative_path/foobar.md) is the path to another file, also see [bar](/absolute/path/foobar.md)

출력이 다음과 같기를 원합니다.

10:[foo](../../relative_path/foobar.md)
10:[bar](/absolute/path/foobar.md)

grep이나 awk, sed와 같은 다른 명령으로 이 작업을 수행할 수 있는 방법이 있나요?

답변1

grep -Pno "[[[:alnum:]]*]\(.*?\)" /path/to/file.md

아니면 더 좋을 수도 있습니다(이것은 심지어 일치할 수도 있습니다).["foo 다른 단어"])

grep -Pno "\[([[:alnum:]]*[[:space:]]*)*?\]\(.*?\)"

-P=> 탐욕스럽지 않은 일치를 위한 Perl Regex?

아니면 만약에원하지 않는다영숫자와 공백만 가능하지만모든 문자방법

 grep -Pno "\[.*?\]\(.*?\)"

답변2

\[([[:alpha:]]|[[:digit:]]|[[:space:]])*\]

일치하면 [foo]괜찮습니다. 오류는 다음과 같습니다.

\((\/|\.).*\)

.*매우 욕심이 많으므로 정규 표현식을 포함할 때 주의해야 합니다 ! 이렇게 하면 일치하게 됩니다 (../../relative_path/foobar.md) is the path to another file, also see [bar](/absolute/path/foobar.md). 이를 연결하면 전체 행이 일치됩니다.

너는 가야 해

grep -Eon '\[([[:alnum:]]|[[:space:]])*\]\((\.|\/)[^)]*\)'

핵심은 .*로 바꾸는 것입니다 [^)]*. 닫는 괄호가 나타날 때 후자의 정규식이 중지되어야 합니다. 또한 다음 변경 사항을 적용했습니다.

  • [[:alpha:]]|[[:digit:]]안으로 접어 넣을 수 있다[[:alnum:]]

산출:

1:[foo](../../relative_path/foobar.md)
1:[bar](/absolute/path/foobar.md)

( 내 파일의 첫 번째 줄이기 때문에 1:그렇지 않습니다 .)10:

답변3

grep -on '\[[^]]*\]([^)]*)'

귀하의 경우에는 충분할 수 있습니다. [...]및 에 나타날 수 있는 문자를 정말로 제한해야 합니까 (...)?

[...]내부 부분이 숫자나 공백으로만 구성되고 내부 부분이 (...)a /또는 a 로 시작하도록 요구하려면 .다음을 수행하세요.

grep -on '\[[[:alnum:][:space:]]*\]([./][^)]*)'

어쨌든, as [^)]*대신에 줄의 끝과 모든 것을 삼킨다는 점에 유의하십시오..*).*))

여기서는 -E|대체 연산자 가 필요하지 않습니다. 단일 문자를 일치시키려면 여러 문자 또는 문자 클래스(여기서는 및 의 약어)를 포함할 수 있는 [set]대괄호 표현식을 사용할 수 있습니다 .set[:alnum:][:alpha:][:digit:][:space:]

답변4

탐욕스럽지 않은 grep을 사용해야 함

추가 ?.*((\/|\.).*?\)

grep -Pon '\[([[:alpha:]]|[[:digit:]]|[[:space:]])*\]\((\/|\.).*?\)' /path/to/file.md

10:[foo](../../relative_path/foobar.md)
10:[bar](/absolute/path/foobar.md)
  • -P탐욕스럽지 않은 지원을 얻으려면. 정규 표현식은 Perl 구문이어야 합니다.

관련 정보