패턴과 일치하는 모든 문자열 찾기

패턴과 일치하는 모든 문자열 찾기

주어진 입력에서 "정확한" 문자열을 찾는 것을 지원하는 명령이 있습니까?

예를 들어:

pattern='s.'
sample_input='abcdsasd kmsa so
msd ks'
some_command $sample_input $pattern 

나는 그것이 출력되기를 원합니다 :

sa
sd
sa
so
sd

중복된 질문을 찾았습니다. https://stackoverflow.com/questions/6259747/print-all-matches-of-a-regular-expression-from-the-command-line

답변1

grep스위치가 있고 -o(또는 --only-matching) 쉘이 다음 문자열을 지원하는 경우 :

grep -o -- "$pattern" <<<"$sample_input"

답변2

pat 변수의 이스케이프 버전을 보유하기 위해 또 다른 var p를 준비합니다.

pat='s.'
p=${pat//\//\\/}
sample_input='abcdsasd kmsa so
msd ks'

perl전체 샘플 입력이 하나의 레코드에 있도록 후루룩 모드에서 사용됩니다.$_

$ printf '%s\n' "$sample_input" | pat="$pat" \
perl -ln -0777e 'print for s/\n\z//r =~ /$ENV{pat}/sg'

sed여기서는 의사코드를 사용합니다:

_DO_=':a'    _UNTIL_NOPAT_=${_DO_/:/t }
_SAVE_='h'   _RETRIEVE_='g'
_RM_PAT_='s/'"$p"'\(.*\)/\1/'
_SLURP_='$!{N;s/^/\n/;D;}'
_CHOMP_R='s/\('"$p"'\).*/\1/'
_CHOMP_L_n_PRNT='s/.*\('"$p"'\)/\1/p'

printf '%s\n' "$sample_input" |
sed -ne "
  ${_SLURP_}
  ${_DO_}
      ${_SAVE_}
          ${_CHOMP_R}
          ${_CHOMP_L_n_PRNT}
      ${_RETRIEVE_}
      ${_RM_PAT_}
  ${_UNTIL_NOPAT_}
"

답변3

에서 zsh쉘 패턴과 일치하는 모든 문자열을 찾으려면 다음 방법을 사용할 수 있습니다.

pattern='s?' # equivalent of regexp 's.'
sample_input='abcdsasd kmsa so
msd ks'

set -o extendedglob
matches=()
: ${sample_input//(#m)$~pattern/${matches[1+$#matches]::=$MATCH}}

여기에 주어진:

$ print -r -- $matches
sa sd sa so sd

이는 GNU를 사용하는 접근 방식에 비해 몇 가지 장점이 있습니다 grep -o.

  • 포함할 수 있는 모든 바이트 또는 문자와 함께 작동합니다 $sample_input. 특히 NUL 및 NL과 유효한 문자의 일부를 형성하지 않는 바이트(여전히 ?or 와 일치함 *).
  • GNUism에 의존할 필요는 없습니다.
  • zsh 패턴은 표준 정규식보다 표현력이 더 뛰어납니다.

zsh 와일드카드에 해당하는 항목이 없는 일부 PCRE 연산자가 있습니다(예: 둘러보기). 이를 사용하려면 zsh의 내장 pcre_match명령을 사용할 수 있습니다. 매뉴얼(참고자료 참조 info zsh pcre_match)에는 이를 수행하는 예제가 있습니다. 일치 항목을 배열로 추출합니다.

관련 정보