查找与模式匹配的所有字符串

查找与模式匹配的所有字符串

是否有任何命令支持在给定输入中查找“精确”字符串?

例如:

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) 开关并且您的 shell 支持以下字符串:

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

答案2

我们准备另一个 var p 来保存 pat 变量的转义版本。

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

在 slurp 模式下使用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,要查找与 shell 模式匹配的所有字符串,可以使用以下方法:

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 以及不构成有效字符一部分的字节(仍将由?或匹配*)。
  • 它不必依赖 GNUism
  • zsh 模式比标准正则表达式更具表现力。

有一些 PCRE 运算符在 zsh 通配符中没有等效项(例如环顾四周)。如果您想使用它们,可以使用 zsh 的内置pcre_match命令。手册(请参阅 参考资料info zsh pcre_match)有一个示例可以做到这一点:将匹配项提取到数组中。

相关内容