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 구문이어야 합니다.