Cygwin에서 grep을 사용하여 일치하는 단어 추출

Cygwin에서 grep을 사용하여 일치하는 단어 추출

저는 Cygwin을 사용하고 있어서 POSIX 정규식 정보를 살펴보았습니다.

XML 파일에서 문자열을 검색하려고 하는데 전체 줄을 계속 가져오지만 찾고 있는 몇 개의 문자로 결과 범위를 좁힐 수 없는 것 같습니다.

파일(file1)에는 여러 인스턴스가 있습니다.

<!ENTITY abc123456 SYSTEM "../blah/abc123456.xyz" NDATA xyz>
<!ENTITY abc123457 SYSTEM "../blah/abc123457.xyz" NDATA xyz>
<!ENTITY abc123458 SYSTEM "../blah/abc123458.xyz" NDATA xyz>

grep 결과에는 전체 행이 나열되지만 결과 범위를 다음과 같이 좁히려고 합니다.

abc123456.xyz
abc123457.xyz
abc123458.xyz

다음은 나에게 다음 줄을 성공적으로 제공합니다.

grep -E abc[[:digit:]] file1
grep abc[0-9] file1
grep "abc[[:digit:]]" file1

내가 찾고 있는 내용이 줄의 시작이나 끝 부분에 없기 때문에 ^ 및 $는 유용하지 않은 것 같습니다. 내가 찾고 있는 것을 어떻게 고정해야 할지 잘 모르겠습니다. 나는 성공하지 못한 채 grep을 사용하여 다른 많은 변형을 시도했습니다.

답변1

더 우아한 솔루션(아마도 하나?)이 있어야 grep -P하지만 간단한 접근 방식만으로는 충분하지 않은 경우 이를 사용하여 원하는 문자열을 sed시뮬레이션 하고 얻을 수 있습니다.grepgrep -o

sed -nr 's/.*SYSTEM "..\/blah\/([^"]*).*/\1/p'

이는 기본적으로 전체 문자열과 일치한 다음 이를 찾고 있는 하위 문자열로 정확하게 바꿉니다.

답변2

grep 명령은 일치하는 항목이 포함된 행을 인쇄합니다. 줄의 일부를 일치시키기 위해 어떤 패턴을 사용하든 grep은 전체 줄을 인쇄합니다.

GNU grep은 패턴과 일치하는 행의 일부만 선택적으로 표시할 수 있는 Cygwin에 포함된 버전입니다 -o.

grep -o 'abc[0-9][^"]*' file1

\b패턴 시작 부분에 추가하여 공백만 일치시키거나 구두점 뒤에 추가 할 수 있습니다 . 즉, 일치를 피하세요 /fooabc123.xyz. /또는 뒤에 구체적으로 일치시키려는 경우 "구두점이 출력에 포함됩니다.역방향 주장Perl 정규식 구문에서 사용할 수 있습니다.

grep -o -P '(?<=[/"])abc[0-9][^"]*' file1

관련 정보