是否有任何命令支持在给定输入中查找“精确”字符串?
例如:
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
)有一个示例可以做到这一点:将匹配项提取到数组中。