art*_*rty 2 scripting bash shell-script
我正在尝试编写一个脚本(script1.sh),当给定一堆字母时,它会找到每个可能的单词。
单词必须以混乱的第一个字母开头并以最后一个字母结尾。
单词的字母需要遵循混乱中的字母顺序。
混乱中的每个字母都可以使用多次。
所以这
./script1.sh "qwertyuytresdftyuiokn"
Run Code Online (Sandbox Code Playgroud)
应该输出queen和question而不是“抚慰”,因为“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)
然后我尝试将混乱变成一个数组,但又一次,我找不到在混乱中找到遵守顺序的单词的方法。
#!/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)
这种模式是 的正确模式grep。q必须在开头至少出现一次,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)