문자열에서 하나 이상의 패턴을 추출합니다.

문자열에서 하나 이상의 패턴을 추출합니다.

다음과 같은 줄이 있습니다.

function( "((2 * VAR(\"xxx\")) - VAR(\"yyy\"))" ?name "name" ?plot t ?save t ?evalType 'point)
function("value(res VAR(\"zzz\"))" ?name "othername" ?plot t ?save t ?evalType 'point)

또한 VAR 함수에 정의된 문자열을 출력하는 명령을 찾고 싶습니다. 즉:

xxx yyy
zzz

시도해 보았지만 sed제가 이해하는 한 탐욕스럽지 않은 방식으로는 할 수 없습니다.

답변1

grepPerl 호환 정규식(PCRE)을 지원하는 프로그램이 있는 경우 다음을 사용할 수 있습니다.

grep -Po 'VAR\(\\"\K[^\\]*'

또는 (좀 더 대칭적입니다. 뒤돌아보기 및 미리보기를 사용하세요)

grep -Po '(?<=VAR\(\\").*?(?=\\")'

전임자.

$ grep -Po 'VAR\(\\"\K[^\\]*'
function( "((2 * VAR(\"xxx\")) - VAR(\"yyy\"))" ?name "name" ?plot t ?save t ?evalType 'point)
function("value(res VAR(\"zzz\"))" ?name "othername" ?plot t ?save t ?evalType 'point)
xxx
yyy
zzz

전임자.

$ grep -Po '(?<=VAR\(\\").*?(?=\\")'
function( "((2 * VAR(\"xxx\")) - VAR(\"yyy\"))" ?name "name" ?plot t ?save t ?evalType 'point)
function("value(res VAR(\"zzz\"))" ?name "othername" ?plot t ?save t ?evalType 'point)
xxx
yyy
zzz

답변2

grep과 같은 정규 표현식을 원한다고 생각합니다. 그런 것 grep 'VAR\("[A-z0-9]*"\)'. 그러나 귀하의 경우에는 이 모든 \"가 작동하지 않습니다. 아마도 다음과 같은 것 같습니다.grep '(^VAR(\")[A-z0-9](^\"))' | grep 'VAR\(\\"[A-z0-9]*\\"\)'

나는 grep을 너무 오랫동안 사용하지 않았습니다. :)

관련 정보