我需要使用shell脚本解决一个难题。 我试图将grep与rev结合起来,并将输出保存到临时文本文件中,但仍不知道如何完全解决。
这是解决的难题:
jsetfl alsfel gaanpl epfdpk regela fneten
包含要使用的单词表的文件位于http://pastebin.com/DP4mFZAr
我知道如何告诉grep在哪里可以find匹配的模式,使用$ grep -Ff wordlist puzzle
来从文本文件中提取固定的string,以及如何使用$ rev puzzle | grep -Ff wordlist puzzle
来search镜像文字$ rev puzzle | grep -Ff wordlist puzzle
$ rev puzzle | grep -Ff wordlist puzzle
,因此处理横线,但我怎么处理垂直的话呢?
我涵盖了水平和垂直的匹配。 主要思想是删除空格,然后使用grep -f
与给定的单词列表,存储在words
文件中。
用grep -f
,结果显示在行内。 如果您只想查看匹配的测试,请使用grep -of
。
$ cat puzzle | tr -d ' ' | grep -f words alsfel gaanpl regela fneten $ cat puzzle | tr -d ' ' | grep -of words als gaan regel eten
为此,我们首先必须转置文件的内容。 为此,我使用我用于我的另一个答案 :
transpose () { awk '{for (i=1; i<=NF; i++) a[i,NR]=$i; max=(max<NF?NF:max)} END {for (i=1; i<=max; i++) {for (j=1; j<=NR; j++) printf "%s%s", a[i,j], (j<NR?OFS:ORS) } }' }
让我们看看:
$ cat puzzle | transpose | tr -d ' ' | grep -f words jagerf slapen esafge tfndet lllkan $ cat puzzle | transpose | tr -d ' ' | grep -of words jager slapen af ge de kan
然后,您可以使用rev
(如您在您的问题中所建议的)来获取镜像文字。 对于垂直镜像的单词, tac
也很有趣。
对于对角线匹配,我认为一个有趣的方法是将每一行移动一点点到左/右。 这条路,
exxxx xgxxx xxgxx
可以变成
exxxx gxxx gxx
你可以使用垂直/水平方法。
为此,您可以按照使用printf格式的变量中所述使用printf :
$ cat a exxxx xgxxx xxgxx $ awk -vc=20 '{printf "%*s\n", c, $0; c-=2}' a exxxx xgxxx xxgxx