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
또는 부분 만 원하는 경우 grep
PCRE 지원과 함께 GNU를 사용하세요.
$ grep -Po ':\S+(?=\s+\|\|)|\|\|\s+\K:\S+' file
:first-var
:second-var
그것은 다음과 같습니다:
perl -lne 'print for /:\S+(?=\s+\|\|)|\|\|\s+\K:\S+/g'
이제 항상 모양이 지정된 선에서 합계를 추출하려면 :foo
다음을 표준으로 수행할 수 있습니다.:bar
anything :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