如何查找遵循特定顺序的单词

art*_*rty 2 scripting bash shell-script

我正在尝试编写一个脚本(script1.sh),当给定一堆字母时,它会找到每个可能的单词。

  • 单词必须以混乱的第一个字母开头并以最后一个字母结尾。

  • 单词的字母需要遵循混乱中的字母顺序。

  • 混乱中的每个字母都可以使用多次。

所以这

./script1.sh "qwertyuytresdftyuiokn"
Run Code Online (Sandbox Code Playgroud)

应该输出queenquestion而不是“抚慰”,因为“E”来之前,“U”,并在混乱的“i”。

我尝试将第一个、最后一个和剩余的字母分配给变量,然后使用 egrep 查找单词,但我找不到使用字母顺序的方法。所以这个也给了我无效的词。

#!/bin/bash

first_letter=$(echo $@ | cut -c1)
last_letter=$(echo $@ |rev| cut -c1)
remaining_letters=$(echo $@ | cut -c2- | rev | cut -c2-)

grep -E "^$first_letter[$remaining_letters]*$last_letter$" /usr/share/dict/words
Run Code Online (Sandbox Code Playgroud)

然后我尝试将混乱变成一个数组,但又一次,我找不到在混乱中找到遵守顺序的单词的方法。

Kam*_*ski 5

#!/bin/sh
pttrn="^$(printf '%s' "$1" | sed -e 's/\(.\)/\1*/g' -e 's/\*/\\+/' -e 's/\*$/\\+/')"'$'
grep "$pttrn" /usr/share/dict/words
Run Code Online (Sandbox Code Playgroud)

通过*在每个字符之后注入,从第一个参数获得模式。然后第一个*改为\+; 最后一个也是*。另外^$被添加。您的示例输入生成以下模式:

^q\+w*e*r*t*y*u*y*t*r*e*s*d*f*t*y*u*i*o*k*n\+$
Run Code Online (Sandbox Code Playgroud)

这种模式是 的正确模式grepq必须在开头至少出现一次,n必须在结尾至少出现一次。中间的每个字母可能出现零次或多次,顺序保持不变。

注意脚本是愚蠢的。如果您使用., [,]或 so提供输入,那么您将获得超出规范的正则表达式。提供合理的输入或扩展脚本以对其进行验证。


例子:

$ ./script1.sh qwertyuytresdftyuiokn
queen
question
$ ./script1.sh te
tee
$ ./script1.sh superuser
seer
serer
spur
super
supper
surer
$
Run Code Online (Sandbox Code Playgroud)