주어진 입력에서 "정확한" 문자열을 찾는 것을 지원하는 명령이 있습니까?
예를 들어:
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
)에는 이를 수행하는 예제가 있습니다. 일치 항목을 배열로 추출합니다.