grep은 여러 정규 표현식의 모든 항목과 일치합니다.

grep은 여러 정규 표현식의 모든 항목과 일치합니다.

SQL 문에서 연결의 일부로 모든 호스트 변수를 추출해야 합니다. 입력 예:

select * from table where :first-var || :second-var

여기에서 "first-var"와 "second-var"를 추출해야 합니다.

다음 방법을 사용하여 그 중 하나를 일치시킬 수 있습니다.

grep -o -E ':\S+\s+\|\|'

':first-var ||'와 일치

grep  -o -E '\|\|\s+:\S+'

일치 '|| : 두 번째 변수'

그러나 이 두 표현식을 교대 패턴으로 결합하면 하나의 결과만 반환됩니다.

grep -o -E '\|\|\s+:\S+|:\S+\s+\|\|'

명령을 여러 패턴으로 분할해도 하나의 결과만 일치합니다.

grep -o -E -e '\|\| :second-var' -e ':first-var \|\|'

의심하다다음은 두 가지 결과를 반환하므로 첫 번째 일치 후 파이프 기호가 "runs out"됩니다.

grep -o -E -e '\| :second-var' -e ':first-var \|'

모든 일치 항목을 어떻게 얻을 수 있나요? 연결 기호는 출력의 일부일 필요는 없습니다. 이 예에서는 "first-var" 및 "second-var"에만 관심이 있습니다.

답변1

문제는 일단 발견되면 :first-var ||나머지 || :second-var텍스트가 사라진다는 것입니다. grep -o겹치지 않는 선 부분만 인쇄할 수 있습니다.

다음을 수행할 수 있습니다.

$ perl -lne 'print for /:\S+\s+\|\|/g, /\|\|\s+:\S+/g' file
:first-var ||
|| :second-var

(모든 :var ||s는 s 앞에 인쇄됩니다 || :var.)

:var또는 부분 만 원하는 경우 grepPCRE 지원과 함께 GNU를 사용하세요.

$ grep -Po ':\S+(?=\s+\|\|)|\|\|\s+\K:\S+' file
:first-var
:second-var

그것은 다음과 같습니다:

perl -lne 'print for /:\S+(?=\s+\|\|)|\|\|\s+\K:\S+/g'

이제 항상 모양이 지정된 선에서 합계를 추출하려면 :foo다음을 표준으로 수행할 수 있습니다.:baranything :foo || :bar

s='[[:space:]]\{1,\}' S='[^[:space:]]\{1,\}'
sed -n "/\(:$S\}\)$s\{1,\}||$s\(:$S\).*/{
  s//\
\1\
\2/
  s/.*\n\(.*\n\)/\1/p
}'

답변2

perl -nE 'say "$1\n$2" if /(:\S+)\s*\|\|\s*(:\S+)/'

답변3

복잡한 정규식을 만들 필요 없이 파일을 두 번만 통과하면 됩니다.

grep -o '|| *[^ ]*' file
grep -o '[^ ]* *||' file

또는 다음과 결합 awk:

grep -o '[^ ]* *|| *[^ ]*' file | awk -F' *\\|\\| *' '{ print $1; print $2 }'

예시 라인 제공

select * from table where :first-var || :second-var

이것은 생산할 것입니다

:first-var
:second-var

관련 정보